我已经读过,提供3D程序是一个好主意,其中渲染涉及渲染之间的休息。这是真的?这会降低CPU负载还是不相关?
如果是这样,你推荐什么方法?此外,这是否与帧速率上限有关,即上限为60 fps,如果没有时间渲染另一帧,请休息并等待我们需要渲染另一帧以达到60fps标记。
我正在使用OpenGL和C ++。
答案 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实现都都是为了做到这一点。