|
|
发表于 2007-7-31 08:22:00
|
显示全部楼层
Re:cpu使用100%,麻烦帮我看一下?
说了怎么就不明白?
MSDN:Unlike GetMessage, the PeekMessage function does not wait for a message to be posted before returning.
也就是说,使用PeekMessage,函数并不等待消息,而使用GetMessage,函数会等待至系统有消息到来。
因此无论系统是否有消息,CPU的资源都被你占用了,CPU就是100%
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
} // CPU 100%
然而使用D3D,调用
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
// Begin the scene
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// End the scene
g_pd3dDevice->EndScene();
}
// Present the backbuffer contents to the display
g_pd3dDevice-> resent( NULL, NULL, NULL, NULL );
却不会占用CPU资源,因此在微软的例子中
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else // 注意这个动作为什么要用else
Render();
}
这里CPU就不是100%了,但是如果你最小化窗口,这时候D3D设备实际上已经处于无效状态,也就是说Render函数中GPU并未处理CPU资源,而是让你的程序把CPU资源全部吃掉了,CPU又是100%。
因此系统的框架应该是这样的
while ( true )
{
if (有系统消息)
{
处理系统消息;
}
else
{
if ( 有游戏本身的消息 )
{
处理游戏本身的消息;
}
if ( 如果需要渲染,比如设备丢失了,窗口最小化了就不能渲染了 )
{
渲染;
}
else
{
Sleep(X); // 把CPU资源让给其他的程序
}
}
}
上面的系统并不能完全保证CPU被合理利用,我们一般尽可能的不要让CPU达到100%(如果是双核就是50%呵呵),有一个简单的办法就是打开帧刷新同步。观察你的FPS,如果你的FPS小于屏幕的刷新频率,这样就有两种情况,一种是你正在创作一款伟大的游戏,游戏硬件设定超前,还有一种情况就是你的程序需要优化了。
上述内容前半部分可以参考,后面部分属于个人意见
|
|