渲染场景后让CPU休息

时间:2012-01-18 02:16:58

标签: c++ opengl render cpu-usage

我已经读过,提供3D程序是一个好主意,其中渲染涉及渲染之间的休息。这是真的?这会降低CPU负载还是不相关?

如果是这样,你推荐什么方法?此外,这是否与帧速率上限有关,即上限为60 fps,如果没有时间渲染另一帧,请休息并等待我们需要渲染另一帧以达到60fps标记。

我正在使用OpenGL和C ++。

6 个答案:

答案 0 :(得分:5)

是的,限制帧速率可以减少CPU负载。

另外,如果你有2000 fps,你的显示器不会显示每一帧,通常只有60fps。 http://en.wikipedia.org/wiki/Refresh_rate

我推荐以下方法(使用提升日期时间和线程库的代码):

#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;
    }
}

答案 1 :(得分:3)

对于简单的场景,这可能是一个好主意。否则,你以2000 fps渲染一个场景,你真的不会比屏幕上的120 Hz或60 Hz更快,所以这些场景都被浪费了。如果您要运行其他应用程序,则CPU利用率较低。如果你正在运行一个旨在成为唯一目标的游戏,那么在没有这种限制的情况下在full-bore运行它。

答案 2 :(得分:1)

我没有听说等待CPU休息有助于提升性能。但是,应该已经发生了同样的效果。 OpenGL应该在帧更新之间保持cpu,所以理论上这不应该是一个问题。也许“cpu rest”的想法来自于每帧不执行事件循环的框架。如果对此有不同的看法,我会看这个帖子。

答案 3 :(得分:0)

在我开始进行图形渲染之前,我有一台网关电脑很好。不久之后,CPU就开始烤面包了。

但这是计算机中的一个缺陷,你不必担心它。

答案 4 :(得分:0)

在具有共享(统一)GPU内存的系统中,例如低端PC和大多数智能手机,CPU和GPU相互竞争内存带宽。执行涉及大量内存访问的其他计算将干扰纹理读取和帧缓冲更新,从而导致帧速率降低。

答案 5 :(得分:0)

游戏引擎应该是多线程的,并且每个线程处理不同的帧缓冲对象,启用双/三缓冲方法(这是必需的)。调用glFinish()不会产生一个线程,但是当没有更多可用的缓冲区用于绘制操作时,对(glX)SwapBuffers ()的调用会自动执行,自动将cpu使用率降低到最佳点。几乎所有的GL实现都都是为了做到这一点。