高 CPU 使用率 OpenGL Ver 3.1 + SDL2
Posted
技术标签:
【中文标题】高 CPU 使用率 OpenGL Ver 3.1 + SDL2【英文标题】:High CPU Usage OpenGL Ver 3.1 + SDL2 【发布时间】:2015-05-10 20:06:08 【问题描述】:在我的项目中,我使用 SDL2 + OpenGL Ver 3.1。有简单的代码。当我想清除缓冲区并开始在其中绘制时,会调用函数 VPreRender()。之后,当我想在屏幕上显示这个缓冲区时,我使用函数 VPostRender()。这些函数在 while 循环中调用。 所以当我运行我的程序时,10-20 分钟后 CPU 使用率高达 80-95%。如果我不调用这些函数,CPU 使用率为 10-15%。我做错了什么?为什么CPU使用率这么高?
bool SDLRender::VPreRender()
glClear ( GL_COLOR_BUFFER_BIT );
bool SDLRender::VPostRender()
SDL_GL_SwapWindow(m_pWindow);
【问题讨论】:
你的循环是什么样子的?如果你有 while(true) VPreRender(); VPostRender(); 那么你得到高 CPU 也就不足为奇了。 如果这就是你所拥有的一切,那么你就没有给 GPU 任何事情要做,所以 CPU 没有什么可等待的,并且会尽可能快地重复执行循环。 【参考方案1】:您通常希望在某个深处的某个地方休眠(尽管理想的是通过条件变量来实现)以防止线程尽可能快地运行。否则,您甚至可以通过一个空的无限循环将 CPU 使用率提高到 100%,而在单处理器机器上没有任何睡眠。如果您针对的是电池有限的系统,这可能会很糟糕。
通常,GUI 系统会在其事件处理过程中隐含地执行此操作。例如,SDL_WaitEventTimeout
应该这样做,并且仅在事件处理循环中使用 1 毫秒的超时值可能会在无事可做时将 CPU 使用率降至几乎为零。
通常不建议手动休眠并重新构建事件循环以允许系统在适当的情况下在后台执行此操作,但您也可以使用SDL_Delay
手动休眠。有时,手动控制在实时应用程序(如游戏)中很有用,成为控制狂可能很有用,但您必须小心不要让事件队列堆积。
【讨论】:
也可以将交换间隔设置为一。这会告诉驱动程序限制应用程序渲染的帧数不会超过显示刷新率。以上是关于高 CPU 使用率 OpenGL Ver 3.1 + SDL2的主要内容,如果未能解决你的问题,请参考以下文章
OSX 上的 glDrawElements 具有高 CPU 使用率