|
|
发表于 2006-4-16 22:02:00
|
显示全部楼层
Re:关于游戏循环的一个问题
我一般用两种方法解决你说的这个问题:
方法1:用Sleep
大概的代码这样写就OK (不考虑失去焦点问题)
MSG msg;
while(1)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)
{
if(msg.message == WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
GameRender();
}
Sleep(2); // 注意这里,用Sleep(2)在Windows下虽然实际上达不到2ms的精度,
// 但可以 空出一个时间片来让Windows自动调度你的CPU,这样实际运
// 行时效果还不错,不会占用CPU 100% (我在WinXP Sp2下试验过)
}
但是这种方法对FPS要求比较高的不太适用,因为每次循环的时间是很不定的,因为Windows本身的时钟就不太准,不过对于一般要求不高的小游戏,这是个较简便的解决方案。
方法2:使用失去焦点就WaitMessage的方法,大致代码如下:
MSG msg
while(1)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)
{
if(msg.message == WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if ( g_bActive )
{
GameRender();
}
else WaitMessage();
}
实际使用中还可在循环中用GetTickCount判断时间以控制 FPS,这种方法精度稍微高一些。
|
|