首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么游戏不使用表达式模板来计算数学呢?

为什么游戏不使用表达式模板来计算数学呢?
EN

Stack Overflow用户
提问于 2012-02-26 09:59:07
回答 3查看 566关注 0票数 2

我可以想象表达式模板做可怕的事情来编译像向量/矩阵/四元数等无处不在的东西,但是如果它有这么大的速度提升,为什么游戏不使用它呢?很明显,SIMD指令可以很好地利用数据级并行。表达式模板和惰性计算结合在一起似乎是有意义的,至少在消除临时性方面是这样的。

因此,虽然像Eigen这样的库宣传了这样的功能,但我并不认为这在中间件(例如Havok)或对速度非常关键的游戏中是常见的。有谁能解释一下这件事吗?它与非确定性或分支预测有关吗?

EN

回答 3

Stack Overflow用户

发布于 2012-02-26 10:13:54

我可以想到很多理由:

  • 它损害了编译时间。更长的编译时间意味着测试您对代码所做的任何更改都需要更长的时间。它伤害了productivity.
  • it's complex。最有可能的是,团队中的许多开发人员不熟悉表达式模板,并将很难阅读和调试它们。
  • 游戏通常必须在多个平台上工作,使用各种编译器,这可能具有广泛的缺点,例如,这可能使高级模板欺骗problematic.
  • It's通常是不必要的。您可以在没有表达式模板的情况下编写高效代码。它只会变得更加冗长,你必须为编译器做更多的手把手操作。
  • 游戏开发人员对10年前没有在游戏中使用的任何东西都持非常怀疑的态度。不久前,几个主要的开发人员坚持使用C:不是因为C++不够好,而是因为它是“新的”。游戏开发人员保守得要死。

当然,一个显而易见的问题是:他们将在哪里使用表达式模板?有没有足够复杂的数学让它真正值得一试?游戏倾向于依赖于相当少量的线性代数运算,这些运算通常在任何情况下都需要大量手工调整。

票数 6
EN

Stack Overflow用户

发布于 2019-11-07 13:14:48

我想补充一个以上答案中没有说明的原因。如果是的话我很抱歉,我错过了。

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

举个例子,

代码语言:javascript
复制
vec3<int> myVec( 3, 5, 4 );
myVec.Normalize();

对于一个整数向量来说,标准化意味着什么?突然之间,当我们将模板添加到数学构造中时,我们会使许多现有的函数失效,比如上面描述的例子。

另外,值得一提的是,由于优化在游戏中非常重要,因此许多数学构造都是通过某些类型进行优化的。GPU是浮点计算器。double占用的浮点数空间是浮点数的两倍,而且计算起来相当慢,即使对于新的游戏开发人员来说,这似乎是一个显而易见的用例。

我希望这个例子是有意义的。模板是一个很好的工具,但游戏中的数学结构并不是使用它们的正确地方。

票数 1
EN

Stack Overflow用户

发布于 2012-02-27 04:29:21

通常,游戏中对性能敏感且数学繁重的部分仍然倾向于在CPU上运行,而不是在GPU上运行,这些部分对大量元素应用相同的基本操作。例如动画混合、物理计算、可见性测试等。

在当前的控制台硬件上优化这类问题的最佳方法通常是尝试将尽可能多的工作批处理在一起,并以最大的数据局部性为目标,以避免昂贵的缓存未命中。然后,可以使用SIMD内部函数优化实际的数学运算,并且通常会仔细地手工优化。表达式模板提供的那种优化可以在手动优化阶段相对容易地执行,但还有其他各种重要的优化也可能执行,而表达式模板不会提供这些优化。通常,这些关键代码会有针对每个目标平台的自定义优化的部分,并且不是很容易移植。

我认为表达式模板没有被广泛使用的原因是,它们增加了软件复杂性(由于jalf所描述的所有原因)到没有真正保证它的非性能关键型代码,同时没有覆盖在概要文件顶部显示的真正性能关键型代码所需的所有优化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9449877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档