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

标签 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 未设置,它们的默认值是什么?

最佳答案

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

一般来说,alSourcei/alSourcef至少涉及调用像 GetContextSuspended 这样的函数,这涉及访问线程本地存储和进入/离开临界区,以及 switch语句(这也意味着通过一个函数指针跳转,该函数指针相当于一个可能的内核外页面中可能未缓存的地址,并且可能会浪费一个 TLB 缓存条目)。
alSourcei进一步需要对引用计数进行线程安全递增,并将新的列表节点分配/附加到源的缓冲区列表中,这意味着调用 malloc 的数量级至少一次。

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

到目前为止,删除对 alSourcef 的调用当然会避免一些不必要的调用,并且由于您说值不可能是 1.0 以外的任何其他值,因此实际上根本没有理由触摸它们,因为这是规范中的默认值。
但是……如果您期望删除这些调用会显着提高速度,那么您可能会感到失望(除非每秒有数十万个调用)。

关于optimization - 使用 OpenAL,设置 AL_PITCH 和 AL_GAIN 是否昂贵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9594645/

相关文章:

MYSQL - 从大表的第二行中选择数据

audio - OpenAL 3D 音效

python - Scipy 优化最小化不可靠

matlab - 优化 MATLAB 代码指南

visual-studio-2008 - 为 Visual Studio 2008 配置 OpenAL

sdk - 如何在 Ubuntu 上安装 OpenAL SDK?

opengl - 在 Ubuntu 中安装 OpenGL 和 OpenAL

audio - OpenAL:设置源类型时出错

c++ - 制作一个长函数内联

optimization - 分布样本概率