我正在用C++重写一些渲染C代码。旧的C代码基本上计算它所需的一切,并在每个帧上呈现它。相反,新的C++代码预先计算它需要的内容,并将其存储为链接列表。
现在,实际的呈现操作是翻译、颜色更改和对GL列表的调用。
虽然在链接列表中执行操作应该非常简单,但结果的方法调用似乎比旧版本(每次计算所有内容--当然,我已经确保了新版本没有重新计算)花费的时间更长。
奇怪的事?它执行的OpenGL操作比旧版本少。但越来越奇怪了。当我为每种类型的操作添加计数器,并在方法的末尾添加一个好的旧printf时,它变得更快了-- gprof和手动测量都证实了这一点。
我还费心地查看了G++在这两种情况下生成的汇编代码(有跟踪也没有跟踪),没有发生重大更改(这是我最初的怀疑)--唯一的区别是为计数器分配了更多的堆栈单词,增加了所述计数器,并准备了printf,然后跳转到它。
同样,-O2和-O3也是如此。我在上使用gcc 4.4.5和gprof 2.20.51。
我想我的问题是:发生了什么事?我做错了什么?是不是有什么东西把我的尺寸和gprof都抛掉了?
发布于 2011-06-05 15:35:55
通过在printf中花费时间,您可能会在下一个OpenGL调用中避免阻塞。
发布于 2011-06-06 09:44:49
如果没有更多的信息,很难知道这里发生了什么,但以下是一些提示:
上确定了一个特定的瓶颈。
这是我自己对可能出错的猜测。发送给GPU的调用需要一些时间才能完成:以前的代码通过混合CPU操作和GPU调用,使CPU和GPU并行工作;相反,新代码首先使CPU在GPU空闲时计算许多事情,然后在CPU没有什么可做的情况下,向GPU提供所有要完成的工作。
https://stackoverflow.com/questions/6243385
复制相似问题