渲染过程中的高CPU负载

时间:2011-05-29 07:33:01

标签: java opengl jogl

我正在渲染由大约500k个三角形组成的相当重的物体。我使用opengl显示列表,在render方法中只调用glCallList。我认为一旦将图形基元编译成显示列表,cpu工作就完成了,它只是告诉gpu绘制。但现在一个cpu核心加载到100%。

你能给我一些线索,为什么会这样?

更新:我已经检查了运行glCallList需要多长时间,它很快,运行它需要大约30毫秒

2 个答案:

答案 0 :(得分:1)

你最有可能达到列表长度的限制,每个列表只有64k个椎体。尝试将你的500k三角形(1500k椎体?)分成更小的块,看看你得到了什么。

你正在使用哪些图形芯片?如果在CPU上处理椎体,那也可能是一个问题

答案 1 :(得分:1)

显示列表神奇地将所有内容卸载到GPU上,这有点神话故事。如果确实如此,则不需要将纹理对象和顶点缓冲区添加到OpenGL中。所有的显示列表确实是一种方便的方式来重放一系列OpenGL调用,并希望保存一些函数调用/数据转换开销(参见here)。到目前为止,我所使用的PC硬件实现似乎都没有做到这一点。也许它在SGI工作站的时代有所不同,但是现在缓冲对象是可行的。 (像OpenGL Distilled这样的现代OpenGL书籍只有在加入新内容之前才能提供glBegin / glEnd等最简单的提及。)

我看到的显示列表的一个地方是一个巨大的区别是GLX / X11案例,你的应用程序远程运行到你的显示器(X11“服务器”);在这种情况下,使用显示列表确实将所有显示列表状态仅推送到显示侧一次,而非显示列表立即模式应用程序需要使用更多带宽再次发送一堆内容。 / p>

但是,除了显示列表之外,你应该知道围绕vsync和忙碌等待的一些问题(或它的错觉)......见this question/answer.