【问题标题】:Giving the CPU a rest after rendering scene渲染场景后让 CPU 休息一下
【发布时间】:2012-02-12 19:56:43
【问题描述】:

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

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

我正在使用 OpenGL 和 C++。

【问题讨论】:

    标签: c++ opengl render cpu-usage


    【解决方案1】:

    是的,限制帧率可以减少 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;
        }
    }
    

    【讨论】:

    • 如果驱动程序被正确配置为执行垂直同步并且程序没有禁用它,则不需要这样的等待循环。然后 SwapBuffers 将阻塞直到帧被发送到显示器。如果您的程序是多线程的,另一个线程将获得 CPU 时间,我强烈建议您将其用于 I/O、用户输入处理、模拟等。
    • 没有等待循环,是线程休眠,所以另一个线程会接收CPU并威胁输入。另外,如果您想在不使用 V-Sync 的情况下限制 FPS,我建议您使用此方法。假设您希望您的 FPS 略高于显示器刷新率,或者您希望它比显示器刷新率更慢。
    • 通常您希望帧速率与显示器刷新率完全一致。否则,您要么得到节拍(使用 V-Sync),要么得到撕裂的伪像。由于 while 语句,我把它误认为是等待循环。实时图形程序中通常没有“drawLoop”。你有一个事件循环,它以稳定的速度调用绘图函数。
    【解决方案2】:

    对于简单的场景,这可能是个好主意。否则,您正在以 2000 fps 的速度渲染场景,而屏幕上的速度真的永远不会超过 120 Hz 或 60 Hz,所以这些场景都被浪费了。当您有其他要运行的应用程序时,这种较低的 CPU 利用率很好。如果您运行的游戏旨在成为唯一可以运行的游戏,那么请在 full-bore 运行它,而无需此类限制。

    【讨论】:

    • 我不同意。即使它是唯一运行的东西,也会消耗大量电力,从而消耗电池和电费。
    • UX 建议:不要将软件设计成唯一的事情。在 PC(包括 Mac)用户期望的多任务环境中,等待超过 10 秒以 Alt+Tab 退出或返回应用程序在这样的环境中是非常粗鲁的。智能手机和平板电脑用户也期待多任务处理。游戏机可能是个例外,但我需要很少的经验来判断。
    【解决方案3】:

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

    【讨论】:

    • OpenGL 本身并不指导应用程序流程。如果“外部”没有等待机制,OpenGL 应用程序可以像任何其他指令一样频繁地向重绘调用(glClear、...、glSwapBuffers)发送垃圾邮件。 OpenGL 可以保护 GPU 免受此类垃圾邮件的影响,但它无法控制 CPU。
    【解决方案4】:

    在我开始进行图形渲染之前,我的 Gateway 计算机一直很好。不久之后,CPU 变得吐司。

    但那是电脑的一个缺陷,你不必担心。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-06
          • 2014-08-19
          • 2023-03-23
          • 2015-10-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多