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