游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4334|回复: 10

关于游戏消息循环的疑惑

[复制链接]

1

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2007-9-5 20:31:00 | 显示全部楼层 |阅读模式
    看了一些游戏开发的书发现上面在处理消息循环的时候推荐使用如下代码:
    while(TRUE)
    {
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {
       
                if (msg.message == WM_QUIT)
                    break;
                TranslateMessage(&msg);
                DispatchMessage(&msg);
         }
   }
   而不是使用下面的代码:
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    如果使用上面的代码,程序的CPU占用率非常高,而下面一种就不会。那为什么大多数书上推荐使用这种代码结构来处理消息呢? [em4] [em4] [em4]

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2007-9-5 22:45:00 | 显示全部楼层

Re:关于游戏消息循环的疑惑

上面那种是除了消息处理以外的时间都在跑主update吧,你把代码没贴全。
cpu占用率高是update在玩命跑没有sleep的缘故吧。
两种方式实质上是一样,下面的那种不方便插入update

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2007-9-5 22:49:00 | 显示全部楼层

Re:关于游戏消息循环的疑惑


  1.         while(true)
  2.         {
  3.                 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  4.                 {
  5.                         if (msg.message == WM_QUIT)
  6.                                 break;

  7.                         if (!TranslateAccelerator(hWnd, NULL, &msg))
  8.                         {
  9.                                 TranslateMessage(&msg);
  10.                                 DispatchMessage(&msg);
  11.                         }
  12.                 }
  13.                 else
  14.                 {
  15.                         app.Process();//如果这里面不sleep,cpu肯定占满了。
  16.                 }
  17.         }
复制代码

8

主题

390

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-9-6 09:57:00 | 显示全部楼层

Re:关于游戏消息循环的疑惑

其实,我们的程序应该尽量占用cpu,而不是让你闲着尿尿,。。。。

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2007-9-6 14:11:00 | 显示全部楼层

Re:关于游戏消息循环的疑惑

GetMessage and PeekMessage execute the same code. The major difference between the two is in the case where there are no messages to be returned to the application. In this case, GetMessage puts the application to sleep while PeekMessage returns to the application with a NULL value.

摘自:MSDN - GetMessage and PeekMessage Internals

这是CPU占用率大的原因,也正因为如此,如果你要插入自己的东西,自然会选PeekMessage,像上面lights说的一样。
另外,游戏需要尽量高的CPU占用率(想想每帧都要执行多少东西),自然也就要选择PeekMessage。

11

主题

190

帖子

255

积分

中级会员

Rank: 3Rank: 3

积分
255
发表于 2007-9-6 16:19:00 | 显示全部楼层

Re:关于游戏消息循环的疑惑

如果是fps游戏的话当然是cpu占的越高越好,如果是其他类型的游戏就不行了,玩家有可能双开甚至多开,有可能玩游戏的时候聊QQ,看电影等等,如果把cpu占满单就老板这一关就过不了。

建议使用MsgWaitForMultipleObjects这个函数,在等待消息的同时可以同时等待Event,然后用这个Event来控制帧数,这样的话在等待消息的时候就可以把cpu释放掉。

9

主题

102

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
发表于 2007-9-7 15:57:00 | 显示全部楼层

Re:关于游戏消息循环的疑惑

我用VB的时候,是自己封装的消息队列

9

主题

102

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
发表于 2007-9-7 15:58:00 | 显示全部楼层

Re:关于游戏消息循环的疑惑

建议楼主看看《游戏开发全接触》就知道真正专业的消息泵怎么写了

14

主题

251

帖子

251

积分

中级会员

Rank: 3Rank: 3

积分
251
发表于 2007-10-7 05:37:00 | 显示全部楼层

Re:关于游戏消息循环的疑惑

不同类型的游戏写法不同

14

主题

251

帖子

251

积分

中级会员

Rank: 3Rank: 3

积分
251
发表于 2007-10-7 05:38:00 | 显示全部楼层

Re:关于游戏消息循环的疑惑

哪有一概而论的东西啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-20 19:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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