每当我播放声音效果时,我都会使用:
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默认值是什么值?
答案 0 :(得分:8)
就优化位而言,只有“一般”类型的答案是可能的,因为实现不是 required 以某种特定方式工作,只要它在规定的条件下工作即可通过OpenAL规范。然而,所有实现或多或少都可能类似地工作。
通常,alSourcei
/ alSourcef
至少涉及调用GetContextSuspended
之类的函数,该函数涉及对线程本地存储的访问以及进入/离开关键部分,以及一个switch
语句(它还意味着跳转一个函数指针,该函数指针相当于一个可能不在核心页面中的缓存地址,并且可能浪费一个TLB缓存条目)。
alSourcei
还需要对引用计数进行线程安全的增量,并将新的列表节点分配/附加到源的缓冲区列表,这意味着调用{{1}的数量级的东西至少一次。
设置malloc
和AL_GAIN
本身几乎是免费操作。它设置一个值并将源标记为更新,因此上下文混合器线程在混合下一个时间片时知道某些内容已更改。在最坏的情况下,如果参数是非法的,AL_PITCH
需要设置最后一个错误代码。
就此而言,删除对alSourcef
的调用当然会避免一些不必要的调用,并且因为你说除了1.0之外没有任何其他值,所以实际上没有理由 完全触摸它们,因为这是根据规范的默认值
但是......如果你期望通过移除这些来电显着提高速度,你可能会感到失望(除非每秒有几十万个)。