我可以想象表达式模板做了很糟糕的事情来编译像矢量/矩阵/四元数等普遍存在的东西时间,但如果它是如此之高的速度提升,为什么游戏不使用它?很明显,SIMD指令可以充分利用数据级并行性。表达模板和懒惰评估似乎是合理的,至少在消除临时性时是这样。因此,像Eigen这样的图书馆宣传这些功能时,我不会在中间件(例如Havok)或其中速度极其重要的游戏中看到这一点。任何人都可以对此有所了解吗?它是否与非确定性或分支预测有关?为什么游戏不使用数学表达式模板?
1
A
回答
5
我能想到很多原因的:
- 疼编译时间。更长的编译时间意味着测试您对代码所做的任何更改需要更长的时间。它伤害生产力。
- 这很复杂。很可能,团队中的许多开发人员不熟悉表达式模板,并且很难阅读和调试它们。
- 游戏通常需要在多个平台上工作,各种编译器可能有各种各样的缺点,这可能会导致高级模板技巧的问题。
- 通常没有必要。您可以编写高效的代码而无需表达式模板它只是变得更加冗长,你必须为编译器做更多的手工操作。
- 游戏开发者对10年前游戏中尚未使用的任何东西都持怀疑态度。不久前,几位主要开发人员坚持C:不是因为C++不够好,而是因为它是“新”。游戏开发者是地狱般的保守派。
当然,显而易见的问题是:哪里有他们会使用表达式模板?是否有足够的复杂数学真的使它值得吗?游戏往往依赖于相当少量的线性代数运算,在任何情况下,这些运算通常都会进行大量的手动调整。
0
通常情况下,既性能敏感又数学沉重且仍倾向于在CPU上运行而不是在GPU上的游戏部分正在对大量元素应用相同的基本操作。一些例子是动画混合,物理计算,能见度测试等。
在当前控制台硬件上优化这类问题的最佳方法通常是尝试尽可能多的工作,尽可能多的工作,并争取最大的数据位置以避免昂贵的缓存未命中。然后可以使用SIMD内在函数对实际的数学进行优化,并且通常会仔细手动优化。表达式模板给予您的优化类型可以在手优化阶段相对容易地执行,但还有其他各种重要的优化,表达式模板不会给您提供。通常这个关键的代码将会为每个目标平台设置自定义优化的部分,并且不会很便携。
我认为表达式模板没有被广泛使用的原因是它们将软件复杂性(出于所有由jalf描述的原因)添加到非性能关键代码,这些代码并不真正保证它,而不覆盖所有优化对于出现在配置文件顶部的真正性能严重的代码是必需的。
相关问题
- 1. 为什么使用常量表达式作为模板参数?
- 2. 我应该使用什么C#模板为XNA游戏构建服务器?
- 3. 使用PHP的数学游戏
- 4. 什么可以用作Bubblet游戏的启发式游戏?
- 5. 什么数据库用于iPhone电子学习游戏
- 6. 表达式引擎 - 为什么主目录404中的模板?
- 7. 正则表达式使用python re模块的分数数学表达式
- 8. xcode基本游戏模板
- 9. 简单的数学游戏
- 10. Spoj:ENIGMATH - 玩数学游戏
- 11. Python蛇游戏数学
- 12. 想知道数学游戏
- 13. 游戏数学(速度)
- 14. 简单的数学游戏
- 15. 为什么使用LINQ表达式?
- 16. 通用Lambda表达式VS标准模板函数(使用什么和何时)
- 17. 我应该选择什么方式来学习游戏编程或成为专家级游戏设计师?
- 18. 使用游戏开始和游戏运行有什么区别?
- 19. 模板,为什么用这种方式调用模板函数不起作用?
- 20. 建构井字游戏学习OOP,但我的游戏板不更新
- 21. 正则表达式的填字游戏
- 22. 正则表达式填字游戏
- 23. 为什么我不能使用硒来测试mmorpg游戏?
- 24. 正则表达式模式匹配一个数学表达式
- 25. 对游戏类使用单例模式
- 26. 数学表达式
- 27. 月球着陆器游戏需要什么数学?
- 28. 使用非const表达式作为模板参数
- 29. vbscript数学表达式不起作用
- 30. Android:实现游戏板的最佳方式是什么?
SIMD与什么有什么关系?我没有看到那里的连接 – jalf 2012-02-26 02:14:18
SIMD指令与表达式模板无关,也没有懒惰的评估。它与非确定性或分支预测无关。这四件事中没有一件与表达模板有关。 – 2012-02-26 02:24:00