使用SDL + OpenGL的高CPU使用率
High CPU usage with SDL + OpenGL
我有一个现代的CPU (AMD FX 4170)和一个现代的GPU (NVidia GTX 660)。然而,这个简单的程序设法充分利用了我的一个CPU核心。这意味着它使用一个4.2 GHz内核在60 FPS下绘制nothing。这个项目有什么问题吗?
#include <SDL/SDL.h>
int main(int argc, char** argv)
{
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
SDL_SetVideoMode(800, 600, 0, SDL_OPENGL | SDL_RESIZABLE);
while(true)
{
Uint32 now = SDL_GetTicks();
SDL_GL_SwapBuffers();
int delay = 1000 / 60 - (SDL_GetTicks() - now);
if(delay > 0) SDL_Delay(delay);
}
return 0;
}
事实证明,NVidia的驱动程序实现等待vsync与一个繁忙循环,导致SDL_GL_SwapBuffers()使用100%的CPU。在NVidia控制面板中关闭垂直同步可消除此问题。
循环使用尽可能多的计算能力。主要问题可能在:
int delay = 1000 / 60 - (SDL_GetTicks() - now);
您的延迟持续时间可能小于零,这样您的操作可能只是一个无限循环而不等待。需要控制变量delay
的值
此外,在这个链接中:有人建议
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,1);
可以用来启用vsync,这样它就不会占用所有的CPU
相关文章:
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 如何降低应用程序的 CPU 使用率?
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- 一段时间后 CPU 使用率高
- 高CPU使用率,在API桌面复制中获取帧之间具有不同的超时间隔
- GetDC ReleaseDC 在特定上下文中的高 CPU 使用率
- 从 C++11 代码中获取系统内存和 CPU 使用率
- 在 Visual Studio 中记录 CPU 使用率
- C++如何允许等待而不会过多的 CPU 使用率
- Qtcreator 冻结,CPU 使用率为 100%
- 使用 fgets() c++ 读取大型 txt 文件时的 CPU 使用率为 99%
- OpenCL 的 CPU 使用率意外
- Loop Wregex始终返回false和高CPU使用率约50%
- 简单的C++SFML程序高CPU使用率
- 使用 PID 获取内存和 CPU 使用率
- 如何在TCP端口上实时传输数据期间减少CPU使用率
- WinAPI:在WM_PAINT省略 BeginPaint 和 EndPaint 会导致 100% 的 CPU 使用率
- 当CPU使用率高时,OpenCV会堆积内存吗
- 如何在运行SDL程序时降低CPU使用率