为什么游戏不使用表达式模板进行数学运算?

问题描述 投票:2回答:3

我可以想象表达式模板会做糟糕的事情来为诸如矢量/矩阵/四元数等无处不在的东西编译时间,但是如果速度如此之快,为什么游戏不使用它呢?很明显,SIMD指令可以充分利用数据级并行性。至少在消除临时性方面,表达模板和惰性评估似乎是合情合理的。

因此,虽然像Eigen这样的库都在宣传此类功能,但我认为在中间件(例如Havok)或对速度极为重要的游戏中,这种功能并不常见。谁能对此有所启发?它与不确定性或分支预测有关吗?

c++ templates optimization game-engine expression-templates
3个回答
5
投票

我可以想到很多原因:

  • 这会损害编译时间。更长的编译时间意味着测试对代码所做的任何更改都将花费更长的时间。这会损害生产力。
  • 非常复杂。最有可能的是,团队中的许多开发人员都不熟悉表达式模板,因此很难阅读和调试它们。
  • 游戏通常必须在多个平台上运行,并且使用各种编译器,这些编译器可能具有广泛的缺点,例如可能使高级模板欺骗成为问题。
  • 通常没有必要。您可以在没有表达式模板的情况下编写高效的代码。它变得更加冗长,并且您必须为编译器执行更多操作。
  • 游戏开发人员对10年前游戏中尚未使用的任何东西都非常怀疑。不久前,几位主要的开发人员坚持使用C:不是因为C ++不够好,而是因为它是“新的”。游戏开发者是保守的。

当然还有一个明显的问题:where他们会使用表达式模板吗?是否有足够的complex数学足以使之值得?游戏往往依赖于数量很少的线性代数运算,在任何情况下,通常都需要对其进行大量手动调整。


1
投票

我想补充一个以上答案中未提及的原因。抱歉,我错过了。

向基于数学的类(例如vec3类)添加模板会改变运算符的含义,并导致某些模板类型的函数无效。

例如,

vec3<int> myVec( 3, 5, 4 );
myVec.Normalize();

归一化对整数矢量意味着什么?当我们将模板添加到数学构造中时,突然间,我们使许多现有功能失效,例如上述示例。

另外,值得一提的是,许多数学结构都对某些类型进行了优化,因为优化在游戏中非常重要。 GPU是浮点计算机。尽管双打看起来很明显是一个新游戏开发人员的用例,但双打占用的浮动空间却是其两倍,并且计算起来要慢得多。

我希望这个例子有意义。模板是一个很好的工具,但是游戏中的数学构造并不是使用它们的合适位置。


0
投票

通常,游戏中既对性能敏感又对数学要求很高,并且仍然倾向于在CPU而非GPU上运行的部分正在将相同的基本操作应用于大量元素。一些示例包括动画混合,物理计算,可见性测试等。

在当前控制台硬件上优化这类问题的最佳方法通常是尝试并尽可能多地分批工作,并争取最大的数据局部性以避免昂贵的高速缓存未命中。然后可以使用SIMD内在函数对实际数学进行优化,并且通常会仔细进行手工优化。表达式模板提供给您的那种优化可以在手动优化阶段相对容易地执行,但表达式模板不会给您带来其他重要的优化效果。通常,此关键代码将具有针对每个目标平台进行自定义优化的部分,并且不会非常便携。

我认为表达式模板未得到广泛使用的原因是,它们将软件复杂性(出于jalf所描述的所有原因)添加到了非性能关键的代码中,这在没有涵盖所有必要的优化的同时并不能真正保证它显示在配置文件顶部的真正影响性能的代码。

© www.soinside.com 2019 - 2024. All rights reserved.