在我的项目中,我使用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);
}
答案 0 :(得分:2)
你通常希望在那里深处睡觉(虽然理想的是通过条件变量来做)以防止线程尽可能快地进行。否则,在单处理器计算机上没有任何睡眠的情况下,您甚至可以通过空无限循环将CPU使用率提高到100%。如果您针对电池有限的系统定位,这可能会很糟糕。
通常,GUI系统会隐式执行此操作,作为其事件处理的一部分。例如,SDL_WaitEventTimeout
应该这样做,并且在事件处理循环中使用超时值为1毫秒的那个可能会在没有任何事情要做时将CPU使用率降低到几乎为零。
通常不建议手动睡眠并重新构建事件循环,而是允许系统在适当的时候在底层进行,但您也可以使用SDL_Delay
手动睡眠。有时候,手动控制在实时应用程序中非常有用,比如游戏中控制狂可能很有用,但是你必须小心不要让事件队列堆积起来。