在看 Programming Role Playing Games with DirectX 一书中有下面的代码片段
while(Msg.message != WM_QUIT)
...{
if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE))
...{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
else ...{}
}
发现建立的一个简单的窗口cpu的占有率几乎100%后来在其他介绍window api的书上有下面类似写法:
while( GetMessage( &msg, NULL, 0, 0))
...{
TranslateMessage( &msg);//进行一些键盘消息的转换
DispatchMessage( &msg);
}
//The DispatchMessage function dispatches a message to a window procedure.
//It is typically used to dispatch a message retrieved by the GetMessage function.
后来在网上查到,我总结如下:
后者是用SDK进行Windows程序设计的标准写法。
使用PeekMessage一定会使系统变慢,因为PeekMessage无论是否有消息都会返
回,因此你的程序始终在执行一个死循环,在抢先多任务系统中会使系统变慢
在win3.x这种写作时多任务系统中则会使操作系统down掉。
GetMessage检查事件队列,如果没有事件就会挂起本进程等待时间发生
DispatchMessage总是返回的,及时是空消息也要讲小许分派到窗口过程处理函数的,这样自然cpu100%了
但是Programming Role Playing Games with DirectX 一书用的是前者,不知道3D游戏里面要检测所有的包括空消息的处理么?继续研究中,哪天明白了为什么这本书里面这么写吧,高手看到了一定要给点指点
本文探讨了Windows编程中两种不同的消息循环实现方式:PeekMessage与GetMessage。详细分析了这两种方法的区别及其对CPU占用率的影响,并针对游戏开发场景提出了疑问。
7179





