【发布时间】:2012-02-12 19:56:43
【问题描述】:
我已经读到,在渲染之间给一个涉及渲染的 3D 程序提供一个休息是个好主意。这是真的?这会减少 CPU 负载还是无关?
如果是这样,您推荐什么方法?另外,这是否与帧速率上限有关,即上限为 60 fps,如果没有时间渲染另一帧,请休息并等待,直到我们需要渲染另一帧以满足 60 fps 标记。
我正在使用 OpenGL 和 C++。
【问题讨论】:
标签: c++ opengl render cpu-usage
我已经读到,在渲染之间给一个涉及渲染的 3D 程序提供一个休息是个好主意。这是真的?这会减少 CPU 负载还是无关?
如果是这样,您推荐什么方法?另外,这是否与帧速率上限有关,即上限为 60 fps,如果没有时间渲染另一帧,请休息并等待,直到我们需要渲染另一帧以满足 60 fps 标记。
我正在使用 OpenGL 和 C++。
【问题讨论】:
标签: c++ opengl render cpu-usage
是的,限制帧率可以减少 CPU 负载。
另外,如果您有 2000 fps,您的显示器不会显示每一帧,通常只有 60 fps。 http://en.wikipedia.org/wiki/Refresh_rate
我推荐以下方法(使用boost日期时间和线程库的代码):
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
long desiredFps=60;
void drawLoop() {
using namespace boost;
using namespace boost::posix_time;
ptime lastDraw = microsec_clock::universal_time();
while( true ) {
ptime now = microsec_clock::universal_time();
long diff = (now-lastDraw).total_microseconds();
long desiredDiff = 1000000/desiredFps;
if( diff < desiredDiff ) {
this_thread::sleep(microseconds(desiredDiff-diff));
}
draw();
lastDraw = now;
}
}
【讨论】:
对于简单的场景,这可能是个好主意。否则,您正在以 2000 fps 的速度渲染场景,而屏幕上的速度真的永远不会超过 120 Hz 或 60 Hz,所以这些场景都被浪费了。当您有其他要运行的应用程序时,这种较低的 CPU 利用率很好。如果您运行的游戏旨在成为唯一可以运行的游戏,那么请在 full-bore 运行它,而无需此类限制。
【讨论】:
我没有听说等待 CPU 休息有助于渲染性能。然而,同样的效果应该已经发生了。 OpenGL应该在帧更新之间休息cpu,所以理论上这不应该是一个问题。也许“cpu resting”的想法来自不执行每帧事件循环的框架。如果对此有不同的看法,我会看这个帖子。
【讨论】:
在我开始进行图形渲染之前,我的 Gateway 计算机一直很好。不久之后,CPU 变得吐司。
但那是电脑的一个缺陷,你不必担心。
【讨论】:
在具有共享(统一)GPU 内存的系统中,例如低端 PC 和大多数智能手机,CPU 和 GPU 会相互竞争内存带宽。执行涉及大量内存访问的额外计算会干扰纹理读取和帧缓冲区更新,从而导致帧速率降低。
【讨论】:
游戏引擎应该是多线程的,每个线程处理不同的帧缓冲对象,启用双/三缓冲方法(这是强制性的)。对 glFinish ( ) 的调用不会产生线程,但在没有更多可用缓冲区可用于绘图操作时调用 (glX)SwapBuffers () 会产生线程,从而自动将 cpu 使用率降低到最佳点。几乎所有的 GL 实现都经过了调整。
【讨论】: