OpenGL程序主循环,为什么没有等待函数?

Soyokaze 2011-02-21 12:22:30
典型的Windows窗口程序,有一个消息循环,但是OpenGL的程序,这部分通常为:

[code=C]while(!done) // Loop That Runs While done=FALSE
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting?
{
if (msg.message==WM_QUIT) // Have We Received A Quit Message?
{
done=TRUE; // If So done=TRUE
}
else // If Not, Deal With Window Messages
{
TranslateMessage(&msg); // Translate The Message
DispatchMessage(&msg); // Dispatch The Message
}
}
else // If There Are No Messages
{
// Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
if ((active && !DrawGLScene()) || keys[VK_ESCAPE]) // Active? Was There A Quit Received?
{
done=TRUE; // ESC or DrawGLScene Signalled A Quit
}
else // Not Time To Quit, Update Screen
{
SwapBuffers(hDC); // Swap Buffers (Double Buffering
}
}
}[/code]

上面代码,DrawGLScene()是自定义的渲染函数。平时要是没有窗口消息,PeekMessage()返回False,程序会不断的循环执行DrawGLScene()或SwapBuffers(),这理论上就是死循环了。
但是实际上,OpenGL的程序框架大体都是这个样子,而且执行的很好,并没有CPU占用100%的现象。请问大家这是为什么?是不是OpenGL内部有系统资源占用自动协调机制?
我刚开始学OpenGL,对于这些还不是太清楚,请大家不吝赐教。
...全文
219 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
gamemagic 2011-02-21
  • 打赏
  • 举报
回复
gl默认是开启了垂直同步的,同步显示器刷新率,内部应该有WaitObject调用
dengzikun 2011-02-21
  • 打赏
  • 举报
回复
CPU会和GPU同步,即在DrawGLScene中会有opengl函数调用阻塞,相当于Sleep了。
renxu350 2011-02-21
  • 打赏
  • 举报
回复
死循环与CPU占用100%是两个不同的概念,
CPU占用100%这个问题牵涉操作系统的线程调度机制,
OGL内部没有系统资源占用自动协调机制,
这个机制只有线程级别、操作系统级才能调度,
线程被分配的CPU时间是由CPU、操作系统分配的
WINDOWS-NT是线程抢占式

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧