游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8216|回复: 16

程序的主流程应该如何写才不让CPU占用率为100%?

[复制链接]

36

主题

135

帖子

135

积分

注册会员

Rank: 2

积分
135
发表于 2004-3-19 13:00:00 | 显示全部楼层 |阅读模式
void CGame::GameLoop()
{
    //Enter the game loop
    MSG msg;
    BOOL fMessage;

    PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);

        //Game started, so record time
        m_dwStartTime = timeGetTime();

    while(msg.message != WM_QUIT)
    {
        fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);

        if(fMessage)
        {
            //Process message
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            //Render the current scene
            m_GameScene.Render();
        }

    }
}
这样写是否必须?这样写的CPU占用率为100%,应该怎样解决?

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2004-3-19 13:07:00 | 显示全部楼层

Re:程序的主流程应该如何写才不让CPU占用率为100%?

在render后加上sleep

51

主题

150

帖子

250

积分

中级会员

Rank: 3Rank: 3

积分
250
发表于 2004-3-19 15:31:00 | 显示全部楼层

Re: 程序的主流程应该如何写才不让CPU占用率为100%?


m_GameScene.Render()是用DX写游戏吗? 如果是, 应该很正常.

36

主题

135

帖子

135

积分

注册会员

Rank: 2

积分
135
 楼主| 发表于 2004-3-19 15:52:00 | 显示全部楼层

Re:程序的主流程应该如何写才不让CPU占用率为100%?

sleep()会让程序停滞,降低了FPS,其实如果使用GetMessage()的循环的话就不会有问题,就像dxsdk里面的那些例程一样,不过我不太懂用PeekMessage()问什么就导致cpu占用率为100%?

m_GameScene.Render()是渲染整个场景,我封装到一个类中去了。

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2004-3-19 16:07:00 | 显示全部楼层

Re:程序的主流程应该如何写才不让CPU占用率为100%?

小朋友,不懂不要乱发言
DXSDK里的一样是把CPU占满的
你这样跑循环当然不会释放CPU了

15

主题

73

帖子

81

积分

注册会员

Rank: 2

积分
81
发表于 2004-3-19 16:19:00 | 显示全部楼层

Re:程序的主流程应该如何写才不让CPU占用率为100%?

因为 PeekMessage()他要等待相应 而GetMessage()却不等待,他会一直运行下去无论你是否点击了鼠标,但PeekMessage他是执行完上一次操作后等待下一次鼠标操作.

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2004-3-19 17:15:00 | 显示全部楼层

Re:程序的主流程应该如何写才不让CPU占用率为100%?

WinXP似乎会自动调整CPU使用率.

我这个很奇怪,当运行量很少时,CPU占用少于1%,而FPS=40,
而随着运行量的增多,CPU占用逐渐增多,FPS也上升,目前FPS=72左右,CPU占用80%-90%.

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
        MSG                msg;

    if( !InitWindow( hInst ) ) return 0;

        if( !InitDirect2D() ) return 0;

        if( !InitData() ) return 0;

        while( TRUE )
        {
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                {
                        if( msg.message == WM_QUIT )
                        {
                                return msg.wParam;
                        }
                        if( TranslateAccelerator( g_hWnd, g_hAccel, &msg ) == 0 )
                        {
                                TranslateMessage( &msg );
                                DispatchMessage( &msg );
                        }
                }
                else if( g_bAppActive )
                {
                        if( Render() == 0 )
                        {
                                PostMessage( g_hWnd, WM_DESTROY, 0, 0 );
                        }
                }
                else
                {
                        WaitMessage();
                }
        }

        return 0;
}

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-3-19 17:15:00 | 显示全部楼层

Re:程序的主流程应该如何写才不让CPU占用率为100%?

刚好相反,GetMessage()和PeekMessage()都是从消息队列中抓取消息,但两者的情况则刚好相反。GetMessage()如果没有从队列中抓取到消息,则控制权会被转移给其它程序,直到抓取到消息才把控制权返回给调用GetMessage()的程序。而PeekMessage()没有抓取到消息就会把控制权返回。所以使用PeekMessage(),在没有消息的时候,你的程序也是在不停的执行循环,并且你又没有释放控制,因此CPU的占用就会为100%。

36

主题

135

帖子

135

积分

注册会员

Rank: 2

积分
135
 楼主| 发表于 2004-3-19 21:27:00 | 显示全部楼层

Re:程序的主流程应该如何写才不让CPU占用率为100%?

那到底用Get呢还是Peek呢?

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-3-19 22:55:00 | 显示全部楼层

Re:程序的主流程应该如何写才不让CPU占用率为100%?

一般来说都是使用PeekMessage来使程序不被阻塞,因为如果使用GetMessage()的话,你的程序没有消息就会被阻塞。或者你完全放弃消息的处理,不去抓消息。如果不抓消息的话,窗口的默认动作都无法处理,需要使用DINPUT来处理输入。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-5-16 08:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表