2012-03-07 17 views
5

每當我播放聲音效果我使用:使用OpenAL,設置AL_PITCH和AL_GAIN是否昂貴?

alSourcei(sources[index], AL_BUFFER, 0); 
alSourcei(sources[index], AL_BUFFER, bufferID); 
alSourcef(sources[index], AL_PITCH, 1.0); 
alSourcef(sources[index], AL_GAIN, 1.0);

會是刪除設置每一個音效播放時間AL_PITCH和AL_GAIN一個顯著的優化?顯然,因爲它們是1.0,所以每次我初始化聲音時都可以設置一次。如果AL_PITCH和AL_GAIN未設置,那麼默認值是什麼?

回答

8

只有一個「一般」類型的答案是可能的,只要優化位變爲以來的實現並不需要只要以某種特定的方式來工作,因爲它的工作原理是將OpenAL的規範所規定的條件範圍內。儘管如此,所有的實現或多或少都是相似的。

一般而言,alSourcei/alSourcef涉及至少主叫像GetContextSuspended一個功能,它涉及到線程本地存儲和進入/離開臨界區,以及一個switch聲明的訪問(這也意味着通過一個跳躍函數指針相當於可能不在覈心頁面中的可能未緩存的地址,並且可能浪費一個TLB緩存條目)。

alSourcei還需要做一個引用計數的線程安全增量,並將新的列表節點分配/追加到源緩衝區列表,這意味着至少調用一次數量級的數量級。

設置AL_GAINAL_PITCH本身幾乎是免費的操作。它設置一個值並將源標記爲正在更新,因此上下文混合器線程在混合下一個時間片時知道某些內容已更改。在最壞的情況下,如果參數是非法的,alSourcef需要設置最後的錯誤代碼。

就此而言,消除對alSourcef當然會調用避免了一些不必要的電話,因爲你說有沒有機會的值可以是任何東西,但1.0,實際上是沒有理由不斷觸摸它們都,因爲這是根據規範的默認值。
但是......如果您預計移除這些調用會顯着提速,那麼您可能會感到失望(除非每秒有數十萬個)。

+0

謝謝。這是爲了遊戲音效。正如您可以看到任何隨機聲音效果需要播放時清除源緩衝區然後設置源緩衝區。爲每個特定的聲音效果設置單獨的源組是更常見的,這樣我就不必清除和重置緩衝區內容了? – Ryan 2012-03-08 23:40:36

+0

這取決於很多因素。大多數人會需要很多來源,但是又有更多的緩衝區來源。一般來說,每個需要播放的聲音都需要一個來源_concurrently_。一個來源可以由一百萬個緩衝區提供,但一次只能播放一個。不播放的來源不會(不應該)消耗任何CPU資源,但仍會消耗內存。因此,有一些額外的東西不會受到傷害,因爲每個聲音都可能有一個。啓用一個源是一個原子隊列操作,並且排隊一個緩衝區是一個原子隊列操作,所以它們同樣很昂貴。 – Damon 2012-03-09 08:55:45