我可以想象表达式模板会做糟糕的事情来为诸如矢量/矩阵/四元数等无处不在的东西编译时间,但是如果速度如此之快,为什么游戏不使用它呢?很明显,SIMD指令可以充分利用数据级并行性。至少在消除临时性方面,表达模板和惰性评估似乎是合情合理的。
因此,虽然像Eigen这样的库都在宣传此类功能,但我认为在中间件(例如Havok)或对速度极为重要的游戏中,这种功能并不常见。谁能对此有所启发?它与不确定性或分支预测有关吗?
我可以想到很多原因:
当然还有一个明显的问题:where他们会使用表达式模板吗?是否有足够的complex数学足以使之值得?游戏往往依赖于数量很少的线性代数运算,在任何情况下,通常都需要对其进行大量手动调整。
我想补充一个以上答案中未提及的原因。抱歉,我错过了。
向基于数学的类(例如vec3类)添加模板会改变运算符的含义,并导致某些模板类型的函数无效。
例如,
vec3<int> myVec( 3, 5, 4 );
myVec.Normalize();
归一化对整数矢量意味着什么?当我们将模板添加到数学构造中时,突然间,我们使许多现有功能失效,例如上述示例。
另外,值得一提的是,许多数学结构都对某些类型进行了优化,因为优化在游戏中非常重要。 GPU是浮点计算机。尽管双打看起来很明显是一个新游戏开发人员的用例,但双打占用的浮动空间却是其两倍,并且计算起来要慢得多。
我希望这个例子有意义。模板是一个很好的工具,但是游戏中的数学构造并不是使用它们的合适位置。
通常,游戏中既对性能敏感又对数学要求很高,并且仍然倾向于在CPU而非GPU上运行的部分正在将相同的基本操作应用于大量元素。一些示例包括动画混合,物理计算,可见性测试等。
在当前控制台硬件上优化这类问题的最佳方法通常是尝试并尽可能多地分批工作,并争取最大的数据局部性以避免昂贵的高速缓存未命中。然后可以使用SIMD内在函数对实际数学进行优化,并且通常会仔细进行手工优化。表达式模板提供给您的那种优化可以在手动优化阶段相对容易地执行,但表达式模板不会给您带来其他重要的优化效果。通常,此关键代码将具有针对每个目标平台进行自定义优化的部分,并且不会非常便携。
我认为表达式模板未得到广泛使用的原因是,它们将软件复杂性(出于jalf所描述的所有原因)添加到了非性能关键的代码中,这在没有涵盖所有必要的优化的同时并不能真正保证它显示在配置文件顶部的真正影响性能的代码。