0

我正在用 C++ 重写一些渲染 C 代码。旧的 C 代码基本上计算它需要的所有内容并在每一帧渲染它。新的 C++ 代码改为预先计算它需要的内容并将其存储为链表。

现在,实际的渲染操作是翻译、颜色更改和对 GL 列表的调用。

虽然执行链表中的操作应该非常简单,但结果方法调用似乎比旧版本花费的时间更长(每次都会计算所有内容 - 我当然确保新版本不会重新计算)。

奇怪的事?它执行的 OpenGL 操作比旧版本少。但它变得更奇怪了。当我为每种类型的操作添加计数器,并在方法结束时添加一个很好的旧 printf 时,它变得更快- gprof 和手动测量都证实了这一点。

我还费心看一下 G++ 在两种情况下(有和没有跟踪)生成的汇编代码,并且没有重大变化(这是我最初的怀疑) - 唯一的区别是为计数器分配了更多的堆栈字,增加所述计数器,并准备 printf 然后跳转到它。

同样,这对 -O2 和 -O3 都适用。我在 Ubuntu Maverick 上使用 gcc 4.4.5 和 gprof 2.20.51。

我想我的问题是:发生了什么?我究竟做错了什么?有什么东西让我的测量结果和 gprof 都丢了?

4

2 回答 2

3

通过在 printf 中花费时间,您可能会避免在下一次 OpenGL 调用中出现停顿。

于 2011-06-05T15:35:55.737 回答
1

没有更多信息,很难知道这里发生了什么,但这里有一些提示:

  • 你确定OpenGL调用是一样的吗?您可以使用一些工具来比较发出的调用。确保没有由可能不同的完成顺序引入状态变化。
  • 您是否尝试过在运行时使用分析器?如果您有很多对象,那么在遍历列表时追逐指针的简单事实可能会导致缓存未命中。
  • 您是否在 CPU 端或 GPU 端发现了特定的瓶颈?

这是我自己对可能出现问题的猜测。您发送到 GPU 的调用需要一些时间才能完成:前面的代码通过混合 CPU 操作和 GPU 调用,使 CPU 和 GPU 并行工作;相反,新代码首先让 CPU 在 GPU 空闲时计算许多事情,然后在 CPU 无事可做时将所有工作提供给 GPU。

于 2011-06-06T09:44:49.717 回答