C ++性能怪异w / OpenGL

时间:2011-06-05 14:01:47

标签: c++ opengl g++ gprof

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

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

虽然在链表中执行操作应该非常简单,但看起来生成的方法调用需要比旧版本更长的时间(每次计算所有内容 - 我当然确保新版本不是重新计算)。

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

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

此外,这适用于-O2和-O3。我在Ubuntu Maverick上使用gcc 4.4.5和gprof 2.20.51。

我想我的问题是:发生了什么事?我究竟做错了什么?有什么东西会丢掉我的测量和gprof吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

  • 您确定OpenGL调用是否相同?您可以使用某种工具来比较发出的调用。确保可能不同的订单完成后没有引入状态更改。
  • 您是否尝试在运行时使用分析器?如果你有很多对象,在循环遍历列表时追逐指针的简单事实可能会引入缓存未命中。
  • 您是否在CPU端或GPU端发现了特定的瓶颈?

这是我自己对可能出错的猜测。您发送给GPU的调用需要一些时间才能完成:前面的代码通过混合CPU操作和GPU调用,使CPU和GPU并行工作;相反,新代码首先使CPU在GPU闲置时计算很多东西,然后向GPU提供所有工作以完成,而CPU则无需做任何事情。