我可以想象表达式模板做可怕的事情来编译像向量/矩阵/四元数等无处不在的东西,但是如果它有这么大的速度提升,为什么游戏不使用它呢?很明显,SIMD指令可以很好地利用数据级并行。表达式模板和惰性计算结合在一起似乎是有意义的,至少在消除临时性方面是这样的。
因此,虽然像Eigen这样的库宣传了这样的功能,但我并不认为这在中间件(例如Havok)或对速度非常关键的游戏中是常见的。有谁能解释一下这件事吗?它与非确定性或分支预测有关吗?
发布于 2012-02-26 10:13:54
我可以想到很多理由:
当然,一个显而易见的问题是:他们将在哪里使用表达式模板?有没有足够复杂的数学让它真正值得一试?游戏倾向于依赖于相当少量的线性代数运算,这些运算通常在任何情况下都需要大量手工调整。
发布于 2019-11-07 13:14:48
我想补充一个以上答案中没有说明的原因。如果是的话我很抱歉,我错过了。
向基于数学的类(如vec3类)添加模板可能会更改运算符的含义,并导致某些模板类型无效的函数。
举个例子,
vec3<int> myVec( 3, 5, 4 );
myVec.Normalize();对于一个整数向量来说,标准化意味着什么?突然之间,当我们将模板添加到数学构造中时,我们会使许多现有的函数失效,比如上面描述的例子。
另外,值得一提的是,由于优化在游戏中非常重要,因此许多数学构造都是通过某些类型进行优化的。GPU是浮点计算器。double占用的浮点数空间是浮点数的两倍,而且计算起来相当慢,即使对于新的游戏开发人员来说,这似乎是一个显而易见的用例。
我希望这个例子是有意义的。模板是一个很好的工具,但游戏中的数学结构并不是使用它们的正确地方。
发布于 2012-02-27 04:29:21
通常,游戏中对性能敏感且数学繁重的部分仍然倾向于在CPU上运行,而不是在GPU上运行,这些部分对大量元素应用相同的基本操作。例如动画混合、物理计算、可见性测试等。
在当前的控制台硬件上优化这类问题的最佳方法通常是尝试将尽可能多的工作批处理在一起,并以最大的数据局部性为目标,以避免昂贵的缓存未命中。然后,可以使用SIMD内部函数优化实际的数学运算,并且通常会仔细地手工优化。表达式模板提供的那种优化可以在手动优化阶段相对容易地执行,但还有其他各种重要的优化也可能执行,而表达式模板不会提供这些优化。通常,这些关键代码会有针对每个目标平台的自定义优化的部分,并且不是很容易移植。
我认为表达式模板没有被广泛使用的原因是,它们增加了软件复杂性(由于jalf所描述的所有原因)到没有真正保证它的非性能关键型代码,同时没有覆盖在概要文件顶部显示的真正性能关键型代码所需的所有优化。
https://stackoverflow.com/questions/9449877
复制相似问题