2

我正在编写游戏代码,在渲染代码中进行速度计算非常重要。

如何获得某些操作的速度?

例如,如何知道乘法是否比 sqrt 更快等?或者我必须进行测试并计算时间。

编程语言是c++,谢谢。

4

4 回答 4

5

这种微优化只是浪费你的时间以获得最小的收益。

使用分析器并从改进您自己的算法和代码开始,只要分析器告诉您游戏花费了大部分时间。

请注意,在某些情况下,您可能必须彻底检查整个软件 - 或其中的主要部分 - 才能实现更高效的设计。在这种情况下,分析器的结果可能会误导没有经验的人。例如,与一劳永逸地缓存其结果相比,优化复杂计算可能会获得最小的收益。

另请参阅这个有点相关的线程

于 2011-02-01T19:05:23.387 回答
1

确定特定操作的速度通常称为分析。分析操作的最佳解决方案是使用分析器。Visual Studio 有一个很好的分析器。Linux 有gprof。如果您的编译器没有分析器,那么如果您经常对代码进行分析,那么购买一个编译器可能是值得的。

如果您必须在不使用专业分析器的情况下度过难关,那么您通常可以通过将自己的分析器嵌入到您的程序中来解决

查看一些分析器的代码。

于 2011-02-01T19:13:19.400 回答
0

您最好的选择是使用 AQTime 之类的工具并进行分析运行。然后你就会知道把时间花在哪里优化。但是过早地或基于猜测工作可能不会让你得到太多,只会使你的代码复杂化或破坏某些东西。最好的办法是进行任何浮点计算,尤其是 sin、cos 等,如果可以的话,将 sqrt 排除在任何循环之外。

我曾经有过这样的事情:

for i = 0 to nc
  for j = 0 to nc
      aij = sqrt(a[i]*b[j])

它计算 nc*nc 平方根。但是由于 sqrt(a*b) 等于 sqrt(a)*sqrt(b),因此您可以预先计算所有 a 和 b 的平方根,这样循环就变成了如下所示的内容。所以不是 nc*nc 平方根,而是 2*nc 平方根。

for i = 0 to nc
  for j = 0 to nc
      aij = asqrt[i]*bsqrt[j]
于 2011-02-01T19:12:13.933 回答
0

您提出的问题在很大程度上取决于您在硬件级别上开发的平台。不仅不同芯片组(英特尔/AMD)之间会有差异,而且平台也会有差异(我怀疑 iPhone 没有那么多指令可以更快地完成某些操作)。

您在问题中声明您正在谈论“渲染代码”。如果您谈论的是实际在 GPU(着色器代码)而不是 CPU 上运行的代码,则规则会发生巨大变化。

正如@thkala 所说,在你开始之前我真的不会担心这个。我发现它不仅更容易,而且可以更快地以一种首先起作用的方式对其进行编码,然后(仅在需要改进时)重写在分析代码时速度较慢的位。与尝试仅使用特定功能相比,更好的算法通常会提供更好的性能。

在我们为 iPhone 开发的游戏中,我唯一记住的是大数学运算 (sqrt) 很慢(不是基本数学运算),而且运行每一帧的 for 循环可以很快吃掉CPU。牢记这一点,我们几乎不需要优化任何代码——因为无论如何它都以 60fps 运行——所以我很高兴一开始我没有担心它。

于 2011-02-01T19:13:07.483 回答