渲染场景后让CPU休息

Giving the CPU a rest after rendering scene

本文关键字:CPU 休息      更新时间:2023-10-16

我已经读到,在渲染之间给涉及渲染的3D程序一个休息是个好主意。这是真的吗?这会减少CPU负载吗?还是无关?

如果是,你推荐什么方法?此外,这与帧速率上限有什么关系吗,即以60帧/秒的速度上限,如果还没有到渲染另一帧的时候,请休息并等待,直到我们需要渲染另一个帧以达到60帧/帧的标记。

我正在使用OpenGL和C++。

是的,限制帧速率可以降低CPU负载。

此外,如果你有2000帧/秒,你的显示器不会显示每一帧,通常只有60帧/秒。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;
    }
}

对于简单的场景,这可能是个好主意。否则,你将以2000帧/秒的速度渲染场景,而你在屏幕上的速度永远不会超过120赫兹或60赫兹,因此这些场景将被浪费。当你有其他应用程序要运行时,这种较低的CPU利用率是很好的。如果你运行的游戏是唯一运行的,那么在没有这种节流的情况下全速运行。

我没有听说等待CPU休息有助于渲染性能。然而,同样的效果应该已经发生了。OpenGL应该在帧更新之间让cpu休息,所以理论上这不应该是一个问题。也许"cpu休息"的想法来自于不按帧执行事件循环的框架。如果对此有不同的看法,我会看看这条线索。

我有一台Gateway计算机,在开始进行图形渲染之前,它一直很好。不久之后,中央处理器就完蛋了。

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

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

游戏引擎应该是多线程的,每个线程在不同的帧缓冲区对象上工作,启用双/三缓冲方法(这是强制性的)。调用glFinish()不会产生线程,但当没有更多可用的缓冲区用于绘图操作时,调用(glX)SwapBuffers ()会产生线程,从而自动将cpu使用率降低到最佳点。几乎每一个GL实现都经过了调整以做到这一点。