渲染场景后让CPU休息
Giving the CPU a rest after rendering scene
我已经读到,在渲染之间给涉及渲染的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实现都经过了调整以做到这一点。
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何禁用 CPU 的无序执行
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 分别测量每个线程上花费的 CPU 时间(C++)
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 您选择的 CPU 不支持 x86-64 指令集
- 如何降低应用程序的 CPU 使用率?
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 如何区分CPU和内存瓶颈?
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- CPU 如何提供memory_order_acquire保证?
- 一段时间后 CPU 使用率高
- C/C++memcpu基准测试:测量CPU和墙时间
- 高CPU使用率,在API桌面复制中获取帧之间具有不同的超时间隔
- 超过CPU时间限制:当MPI_Sent一个非常大的int*时
- 渲染场景后让CPU休息