使用OpenAL,设置AL_PITCH和AL_GAIN是否昂贵?

Rya*_*yan 5 optimization openal

每当我播放音效时,我都会使用:

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默认为什么值?

Dam*_*mon 8

就优化位而言,只有"一般"类型的答案是可能的,因为只要它在OpenAL规范规定的条件下工作,就不需要以某种特定方式工作.然而,所有实现可能或多或少地类似地工作.

通常,alSourcei/ alSourcef涉及至少调用一个函数GetContextSuspended,它涉及访问线程本地存储和进入/离开临界区,以及一个switch语句(它还意味着跳过一个等效于可能没有缓存的函数指针)在可能的核外页面中寻址,并且可能浪费一个TLB缓存条目.

alSourcei进一步需要对引用计数进行线程安全增量,并将新的列表节点分配/附加到源的缓冲区列表,这意味着malloc至少调用一次的数量级.

设置AL_GAINAL_PITCH 本身几乎是免费操作.它设置一个值并将源标记为更新,因此上下文混合器线程在混合下一个时间片时知道某些内容已更改.在最坏的情况下,如果参数是非法的,则alSourcef需要设置最后的错误代码.

就此而言,消除对通话alSourcef过程中会避免一些不必要的电话,因为你说有没有机会的值可以是任何东西,但1.0,实际上是没有理由永远摸他们在所有的,因为这是默认值按照规范.
但是......如果你期望通过移除这些呼叫显着加快速度,你可能会感到失望(除非每秒有几十万个).