Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不';t游戏使用数学表达式模板?_C++_Templates_Optimization_Game Engine_Expression Templates - Fatal编程技术网

C++ 为什么不';t游戏使用数学表达式模板?

C++ 为什么不';t游戏使用数学表达式模板?,c++,templates,optimization,game-engine,expression-templates,C++,Templates,Optimization,Game Engine,Expression Templates,我可以想象表达式模板在编译向量/矩阵/四元数等无处不在的东西时会做一些糟糕的事情,但是如果它能极大地提高速度,为什么游戏不使用它呢?很明显,SIMD指令可以有效地利用数据级并行性。表达式模板和惰性计算结合在一起似乎是有意义的,至少在消除临时变量时是如此 因此,虽然像Eigen这样的库宣传这些特性,但我不认为在中间件(例如Havok)或速度非常关键的游戏中通常会这样做。有人能解释一下吗?这与非决定论或分支预测有关吗?我能想到很多原因: 这会影响编译时间。更长的编译时间意味着测试对代码所做的任何更

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


因此,虽然像Eigen这样的库宣传这些特性,但我不认为在中间件(例如Havok)或速度非常关键的游戏中通常会这样做。有人能解释一下吗?这与非决定论或分支预测有关吗?

我能想到很多原因:

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

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

通常,游戏中既对性能敏感又对数学要求高的部分,仍然倾向于在CPU而不是GPU上运行,它们将相同的基本运算应用于大量元素。例如动画混合、物理计算、可见性测试等

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


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

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

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

比如说,

vec3<int> myVec( 3, 5, 4 );
myVec.Normalize();
vec3myvec(3,5,4);
myVec.Normalize();
标准化对于整数向量意味着什么?当我们将模板添加到数学构造中时,会突然使许多现有函数失效,例如上面描述的示例

另外,另一件值得一提的事情是,许多数学结构都是使用特定类型进行优化的,因为优化在游戏中非常重要。GPU是浮点计算机器。double占用了两倍的浮动空间,计算速度也慢了一点,尽管对于一个新的游戏开发人员来说这似乎是一个显而易见的用例


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

SIMD与任何东西有什么关系?我看不出SIMD指令与表达式模板之间的联系,也看不到惰性计算。它也与非决定论或分支预测无关。这四件事中没有一件与表达式模板有关。10年可能有点多了,它们正在变得更好;今年的大多数主要版本都是使用MSVC 2005构建的:我不仅仅是在谈论编译器的版本,还有语言和语言特性的选择。可以使用现代C++编译器编写C或一些比C类还要小的东西。这是大部分的真实情况,但是随着计算着色器和OpenCL的变化。许多物理计算,尤其是延迟请求,都利用GPU优越的浮点计算。