Optimization 使用OpenAL,设置AL_音高和AL_增益是否昂贵?

Optimization 使用OpenAL,设置AL_音高和AL_增益是否昂贵?,optimization,openal,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); alSourcei(源[索引],AL_缓冲区,0); alSourcei(源[索引]、AL_缓冲区、缓冲区ID); alSo

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

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); alSourcei(源[索引],AL_缓冲区,0); alSourcei(源[索引]、AL_缓冲区、缓冲区ID); alSourcef(资料来源[指数],AL_沥青,1.0); alSourcef(来源[指数],AL_增益,1.0); 取消每次播放音效时的音高和音高增益设置是否会是一个重要的优化?显然,因为它们每次都是1.0,我可以在初始化声音时设置一次。如果没有设置,AL_PITCH和AL_GAIN默认值是什么?

就优化位而言,只有“一般”类型的答案是可能的,因为实现不需要以某种特定方式工作,只要它在OpenAL规范规定的条件下工作。尽管如此,所有的实现都或多或少地起着类似的作用

一般来说,
alSourcei
/
alSourcef
至少涉及调用一个函数,如
GetContextSuspended
,该函数涉及访问线程本地存储和进入/离开关键部分,以及一个
开关
语句(这还意味着跳转函数指针,相当于可能超出核心的页面中可能未缓存的地址,可能会浪费一个TLB缓存条目)

alSourcei
还需要执行引用计数的线程安全增量,并向源的缓冲区列表分配/附加一个新的列表节点,这意味着至少要调用一次
malloc

设置
AL_GAIN
AL_PITCH
本身几乎是一个自由操作。它设置一个值并将源标记为正在更新,因此上下文混合器线程知道在混合下一个时间片时发生了更改。在最坏的情况下,如果参数非法,
alSourcef
需要设置最后一个错误代码

到目前为止,删除对
alSourcef
的调用当然可以避免一些不必要的调用,而且由于您说这些值不可能是1.0以外的任何值,实际上根本没有理由触摸它们,因为根据规范,这是默认值。

但是……如果您希望删除这些电话的速度明显加快,您可能会失望(除非每秒有几十万个).

谢谢。这是游戏音效。你可以看到,每当需要播放任何随机音效时,我都会清除源缓冲区,然后设置源缓冲区。是否更常见的做法是为每个特定音效设置单独的源集,这样我就不必清除和重置缓冲区内容?这取决于很多因素。大多数人们需要很多音源,但缓冲区也比音源多。一般来说,需要同时播放的每个声音都需要一个音源。一个音源可以由一百万个缓冲区提供,但一次只能播放一个。不播放的音源不会(不应该)播放消耗任何CPU资源,但仍会消耗内存。因此,多使用一些不会有什么坏处,每个声音都有一个可能会有坏处。启用一个源是一个原子队列操作,而将缓冲区排队是一个原子队列操作,因此它们同样昂贵。