游戏开发论坛

 找回密码
 立即注册
搜索
楼主: snhun

讨论:效率最高的游戏循环,怎么写?

[复制链接]

0

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2007-5-23 16:51:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

while( true )     // MainLoop
{
        while( HaveMsg )   // 这个地方不是重点,如果消息来得很慢,你一样的要在下一个MainLoop才能处理到,这样会让程序卡住,你要的效率有了,呈现给玩家的却是很卡,而且,这里写成while(1)简直就是天大的笑话
        {
              DoMsg();     // 这里才是你提高效率的地方
        }

        DoGameLogic();     // 这里才是你提高效率的地方
}


花时间多写点代码,自己测试一下,少在这里灌水,看过你的另外一篇帖子,就知道你代码写得少。

32

主题

108

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2007-5-23 17:05:00 | 显示全部楼层

Re: Re: Re: Re: Re:讨论:效率最高的游戏循环,怎么写?

nickzj: Re: Re: Re: Re:讨论:效率最高的游戏循环,怎么写?


你没说错啊,对于MainLoop来说,本来就是“不管有没有系统消息都要处理游戏逻辑”啊,这个不是他写代码写...

我说的话有点歧义,让你们产生误会了。
不过确实是这样,不管有没有系统消息都要处理游戏逻辑。你的观点是非常正确的,只不过LZ有点钻牛角尖而已。

0

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2007-5-23 17:13:00 | 显示全部楼层

Re: Re: Re: Re: Re: Re:讨论:效率最高的游戏循环,怎么写?

iron: Re: Re: Re: Re: Re:讨论:效率最高的游戏循环,怎么写?


我说的话有点歧义,让你们产生误会了。
不过确实是这样,不管有没有系统消息都要处理游戏逻辑。你的观点是非常正确的,只不过LZ有点钻牛角尖而已。

你的话没有歧义,任何一个读得懂代码的人,都会这么说的。
哎~~只是最近在优化我们游戏的,看到一篇对胃口的帖子,结果进来才知道被骗了.....郁闷之极的同时还发现有人对自己的代码都读不懂,实在不忍心看他错下去,所以纠正一下他的说法。但不知道这孩子怎么回事,就是不领情啊。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2007-5-23 18:09:00 | 显示全部楼层

Re: Re:讨论:效率最高的游戏循环,怎么写?

nickzj: Re:讨论:效率最高的游戏循环,怎么写?
你的意思是:
1、有系统消息的时候处理系统消息,处理完了再处理游戏逻辑;(记住,这里处理了游戏逻辑)
2、没有系统消息的时候,就直接处理游戏逻辑。(记住,这里也处理了游戏逻辑)

错了~~~

我的意思是:
1、有系统消息的时候处理“所有的”系统消息(因为是循环),处理完“所有的”系统消息之后,再去处理游戏逻辑;
(注意,不是“处理完1条系统消息,就去处理1次游戏逻辑”的。而是处理完所有的系统消息后,再去处理游戏逻辑的。
处理游戏逻辑,已经说明“没有系统消息”了。
所以是“有消息时只处理消息,不处理游戏逻辑;没有系统消息时才去处理游戏逻辑”)
2、没有系统消息的时候,就直接处理游戏逻辑。

再看看NEHE的。

1、如果有系统消息,就处理系统消息。
2、如果没有系统消息,就去处理游戏逻辑。

我的主张依然不变:
如果程序一直运行的话,
NEHE的代码和我的代码是“功能完全相同”的。
而且我的代码比NEHE的“少做一些无用功”。

0

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2007-5-23 18:24:00 | 显示全部楼层

Re: Re: Re:讨论:效率最高的游戏循环,怎么写?

snhun: Re: Re:讨论:效率最高的游戏循环,怎么写?


错了~~~

我的意思是:
1、有系统消息的时候处理“所有的”系统消息(因为是循环),处理完“[...


表达能力太差了!!!


你的意思是:当处理到游戏逻辑的时候,一定没有系统消息了。
我告诉你,也错了,你只能处理一段时间内的系统消息,就在你处理游戏逻辑的时候,又有系统消息来了,只是你已经跑过了那段while了,所以你不知道。新的系统消息就需要在下一次的MainLoop里面来处理了。这是轮讯机制,不是事件触发机制,你不可能在一个Loop里面可以处理完不同时间片来的系统消息,所以这种写法和用if是一样的道理,最好的方式是用for,或者在while里面加计数器,否则游戏逻辑处理不到,游戏就会卡住,任何玩家都不会接受这种情况的。

来,哥哥给你改一下:
while( true )
{
      int iMsgCnt = 0;
      while( HaveSysMsg )   // 小弟弟,记住了,这里不能写成死循环了,哥哥教你的,要记住,以后写错了,别人要笑话你的
      {
           DoSysMsg();
           iMsgCnt++;
           
           if( iMsgCnt >= 100 )   // 这个100,只是给你举个例子,你不要再钻牛角尖了
           {
                  break;
           }
      }

      DoGameLogic();
}

但是你不能说iron和我的意思是错的,是你表达能力的确欠佳啊。

0

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2007-5-23 18:31:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

说实话,你还差很远,完全没有达到一个游戏开发者的层次,好好想想吧。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2007-5-23 19:08:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

while( true )
{
      int iMsgCnt = 0;
      while( HaveSysMsg )   // 小弟弟,记住了,这里不能写成死循环了
      {
           DoSysMsg();
           iMsgCnt++;
           
           if( iMsgCnt >= 100 )   // 这个100,只是给你举个例子,你不要再钻牛角尖了
           {
                  iMsgCnt = 0;
                  break;
           }
      }

      DoGameLogic();
}
难道这么写,就能解决“你只能处理一段时间内的系统消息,就在你处理游戏逻辑的时候,又有系统消息来了”的问题吗?

0

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2007-5-23 19:16:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

哎~~~说你不懂,你还真不懂,平滑的FPS比起你的每个MainLoop处理的时间更为重要(这里写得不对,我自己修正,应该是都重要),你又不是写深蓝,你是写游戏啊,玩家的感觉还要不要了?难道你喜欢在耍CS时候卡一下?因为你要处理更多的系统消息?

将系统消息的处理速度控制下来,找到一个平衡点,让FPS和MainLoop的处理速度找到一个平衡点最重要。不要在一个Loop里面处理过多的系统消息。拜托了,这个不是很难想的问题啊。

之前也写了代码注释给你看了,控制效率的关键在于,控制 DoSysMsg() 和 DoGameLogic() 的速度,这两个地方多节省1ms,1000个Loop就是1s。当然好的MainLoop的结构还是要要的,我给你举的例子,是经过了上万玩家验证过的。虽然不敢说是最好的设计,但是我可以告诉你,你的想法还是欠缺一些东西,当然想法是好的。

继续努力吧!

0

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2007-5-23 19:24:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

在前几片帖子,已经有很多位仁兄提醒你了,如果在一个MainLoop中处理过多的系统消息,会导致游戏卡一下。我看你就重来没认真看过哦。

0

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2007-5-23 19:30:00 | 显示全部楼层

Re:讨论:效率最高的游戏循环,怎么写?

仔细想想,如果你做商软的,我绝对不会认为你的修改是不恰当的,但是你是要做游戏哦,你一个MainLoop处理100000000个系统消息(因为你说的嘛,要处理完系统消息才处理游戏逻辑),等你再处理游戏逻辑的时候,已经晚了。这就是为什么很多游戏在有非常多物件同时进入视野的时候会卡住的原因,因为就是像你说的一样,要处理完消息之后,再处理游戏逻辑,等你看到游戏可以再run的时候,你的角色已经挂了,你认为这种游戏会有人喜欢耍吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 17:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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