带有OpenGL的C++性能怪异

C++ performance weirdness w/ OpenGL

本文关键字:性能 C++ OpenGL 带有      更新时间:2023-10-16

我正在用C++重写一些呈现C代码。旧的C代码基本上计算它所需要的一切,并在每一帧渲染它。取而代之的是,新的C++代码预先计算它需要什么,并将其存储为链表。

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

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

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

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

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

我想我的问题是:发生了什么?我做错了什么?是不是有什么东西把我的测量和gprof都搞砸了?

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

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

  • 您确定OpenGL调用是相同的吗?您可以使用一些工具来比较发出的呼叫。确保没有由于可能的不同顺序而导致的状态更改
  • 您是否尝试在运行时使用探查器?如果您有许多对象,在列表上循环时追逐指针这一简单事实可能会导致缓存未命中
  • 您是否发现了CPU或GPU方面的特定瓶颈

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