2012-02-26 32 views
1

我可以想象表达式模板做了很糟糕的事情来编译像矢量/矩阵/四元数等普遍存在的东西时间,但如果它是如此之高的速度提升,为什么游戏不使用它?很明显,SIMD指令可以充分利用数据级并行性。表达模板和懒惰评估似乎是合理的,至少在消除临时性时是这样。因此,像Eigen这样的图书馆宣传这些功能时,我不会在中间件(例如Havok)或其中速度极其重要的游戏中看到这一点。任何人都可以对此有所了解吗?它是否与非确定性或分支预测有关?为什么游戏不使用数学表达式模板?

+0

SIMD与什么有什么关系?我没有看到那里的连接 – jalf 2012-02-26 02:14:18

+3

SIMD指令与表达式模板无关,也没有懒惰的评估。它与非确定性或分支预测无关。这四件事中没有一件与表达模板有关。 – 2012-02-26 02:24:00

回答

5

我能想到很多原因的:

  • 疼编译时间。更长的编译时间意味着测试您对代码所做的任何更改需要更长的时间。它伤害生产力。
  • 这很复杂。很可能,团队中的许多开发人员不熟悉表达式模板,并且很难阅读和调试它们。
  • 游戏通常需要在多个平台上工作,各种编译器可能有各种各样的缺点,这可能会导致高级模板技巧的问题。
  • 通常没有必要。您可以编写高效的代码而无需表达式模板它只是变得更加冗长,你必须为编译器做更多的手工操作。
  • 游戏开发者对10年前游戏中尚未使用的任何东西都持怀疑态度。不久前,几位主要开发人员坚持C:不是因为C++不够好,而是因为它是“新”。游戏开发者是地狱般的保守派。

当然,显而易见的问题是:哪里有他们会使用表达式模板?是否有足够的复杂数学真的使它值得吗?游戏往往依赖于相当少量的线性代数运算,在任何情况下,这些运算通常都会进行大量的手动调整。

+3

10年可能会有点多,他们会变得更好;今年的大多数主要版本都是使用MSVC 2005构建的。:P – ssube 2012-02-26 02:26:49

+1

我不只是在讨论编译器版本,还选择了语言和语言功能。有可能使用现代C++编译器来编写C或类的东西比C多一点。 – jalf 2012-02-26 11:41:51

0

通常情况下,既性能敏感又数学沉重且仍倾向于在CPU上运行而不是在GPU上的游戏部分正在对大量元素应用相同的基本操作。一些例子是动画混合,物理计算,能见度测试等。

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

我认为表达式模板没有被广泛使用的原因是它们将软件复杂性(出于所有由jalf描述的原因)添加到非性能关键代码,这些代码并不真正保证它,而不覆盖所有优化对于出现在配置文件顶部的真正性能严重的代码是必需的。