2013-11-26 124 views
0

我正在研究可比較SFML和SDL的基準測試應用程序。我正在進行基準測試的一件事是播放聲音的速度。我在循環中多次播放聲音並計算所需的時間。我需要在播放聲音之間有一段延遲,因爲我首先需要完成播放聲音以重新開始。我用SFML睡眠解決了這個問題,但是我不知道我是否正確地做了這件事。可能不是因爲第一次播放後,應用程序凍結,就像它會在無限循環中一樣。如果音樂仍在播放,我需要它延遲1毫秒。你能幫我解決嗎?SFML - 睡眠計算

我的功能:

void playSound() 
{ 
    sound.setBuffer(buffer); 
    sound.play(); 
} 

void soundBenchmark(int numOfCycles) 
{ 
    sf::Time delayTime = sf::milliseconds(0.01); 
    sf::Clock clock; 
    for(int i = 0; i < numOfCycles; i++) 
    { 
     playSound(); 
     while(sound.Playing) sf::sleep(delayTime); 
    } 
    sf::Time time = clock.getElapsedTime(); 
    cout << "Time required for " << numOfCycles << " cycles playing sound: " << time.asMilliseconds() << " milliseconds.\n"; 
} 

調用函數主:

while(running) 
    { 
     while(window.pollEvent(event)) 
     { 
      if(event.type == sf::Event::Closed) 
      { 
       window.close(); 
       running = false; 
      } 
     } 
     soundBenchmark(20); 
     break; 
    } 
    return 0; 
+0

「播放聲音的速度」是什麼意思?我發現「基準」很奇怪,不知道它是否會給你任何有用的信息... 還請記住,不處理事件可能導致操作系統認爲你的應用程序被凍結。 – Lukas

+0

好吧,圖書館處理信息播放聲音並實際播放它需要幾毫秒的時間。我想在這兩個庫上多次播放聲音,然後找出哪一個播放時間較短。 – Sam

+0

這沒有意義?播放聲音絕對不是一種在任何使用多媒體庫時都會產生重要(甚至是合理的)開銷的操作。關於'sf :: Music',它不會被讀取一次,而是從磁盤流出,因此沒有任何意義。 –

回答

0

我知道這是一個老問題,但只是想指出你的代碼中的錯誤:參數到sf::milliseconds()函數是以毫秒爲單位的實際量,爲十進制值。

所以,如果你想要它等待1ms,你應該輸入sf::milliseconds(1)

此行爲在當前版本中是有效的(今天是2.3版),但我不知道在以前的版本中它是不同的。