游戏开发论坛

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

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

[复制链接]

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

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

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

nickzj: Re: Re:讨论:效率最高的游戏循环,怎么写?
你才要好好学习一下哦!!你写的是两个while,为什么不可能“不管有没有消息都要进入游戏循环”。自己写的都看不懂哈?

你能给我解释一下为什么我的代码是
“不管有没有消息都要进入游戏循环”的吗?

如果有消息,就处理{转换并处理系统消息}
然后再回去判断 while(有没有系统消息),直到没有消息为止啊。

怎么跑到{游戏循环}里了?

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

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

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

如果要像 iron 小弟说的“不管有没有消息都要进入游戏循环”,
那么代码应该这么写才对吧?

while(run)
{
  if(有没有系统消息)
  {
    转换并处理系统消息
  }
  游戏循环
}

我用的是 while(有系统消息){转换并处理系统消息},
直接把当前的所有消息处理完成之后,才去处理游戏循环啊。

0

主题

20

帖子

20

积分

注册会员

Rank: 2

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

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

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

如果要像 iron 小弟说的“不管有没有消息都要进入游戏循环”,
那么代码应该这么写才对吧?

while(run)...


如下是你的代码:
while(run)
{
      while(有没有系统消息)
      {
             转换并处理系统消息
      }

      游戏循环     //有系统消息的时候能跑到这里吗?可以!!没有系统消息的时候能跑到这里吗?也可以!!
                   // 拜托了!!仔细看看你自己的代码,好好想一下,是不是每个LOOP都能跑到!!这样都不是“不管有没有消息都要进入游戏循环”,我看你的语文倒是要好好学习一下了!!
}

另外,请问你在这里用while和用if能有多大的区别?
你都是在MainLoop里面做循环,从你代码上的意义来看,使用While和使用if根本没有区别,因为你一次只能处理一个系统消息。除非你的内嵌的那个While可以处理完一段时间内的所有的系统消息,那么这样做的话?及时性在哪里?

作为一个程序员,要认真的考虑问题,好好想想吧。看看是你表达的是否有问题?还是我理解的有问题,当然我更多的倾向于前者!

0

主题

20

帖子

20

积分

注册会员

Rank: 2

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

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

如果你没有动手实践过,请把你的想法写成代码实践一下,我可以很认真的告诉你,你改的那段代码结构是不科学的,游戏中循环效率的提升更多的依赖于“消息处理”和“游戏逻辑处理”的速度,也就是你编码的质量,当然也离不开MainLoop的设计,当两者孰轻孰重,写一下就知道了。
不是说你的思考没有道理,只是效率的关键还是在于细节,宏观上的架构只能决定一个规模而已。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

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

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

nickzj: Re: Re:讨论:效率最高的游戏循环,怎么写?
while(run)
{
      while(有没有系统消息)
      {
             转换并处理系统消息
      }

      游戏循环     //有系统消息的时候能跑到这里吗?可以!!没有系统消息的时候能跑到这里吗?也可以!!
}

请解释一下红色部分。
为什么 while(有系统消息=true)时可以跑到 游戏循环?
while不是“只要条件为真,就只运行自己”吗?
[em5]
你说“用了两个 while,就能跑到‘游戏循环’里”?
所以我做了如下的实验:
while(1)
{
      while(1)//就是把“有系统消息”直接设置为true了
      {
             转换并处理系统消息
      }
      游戏循环
}
这样也可以跑到“游戏循环”吗?

实验证明,如果“有系统消息 == true”,就绝对不会跑到 “游戏循环”。
而且if改成while之后, FPS(就是刷新率) 从694变为702了。

29

主题

224

帖子

224

积分

中级会员

Rank: 3Rank: 3

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

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

"游戏循环"是什么东东?
如果是绘图函数,当消息多的时候画面不还是卡吗?
另:FPS应该不是稳定的一个数字吧?况且从694到702,汗,提升了1.15%,貌似看不出来吧,后台开个小程序就抵消了。

0

主题

20

帖子

20

积分

注册会员

Rank: 2

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

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

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


请解释一下红色部分。
为什么 while(有系统消息=true)时可以跑到 游戏循环?
while不是“只要条件为真,...


我真是要晕死哦,while里面写个1,死循环!!!那这个MainLoop拿来搞啥子喃?你何必要写外面的那个while喃?就只处理系统消息就可以了哈??
我真不知道你怎么想的,都给你解释的这么明显了,既然你程序看不懂,中文总还是看得懂吧:
按照你的代码:
1、当没有系统消息来的时候,while(是否有系统消息)不成立,直接处理游戏逻辑;
2、当有系统消息来的时候,用while(是否有系统消息)来处理,对的!但是,系统消息总有处理完的时候吧,处理完了之后,while(是否有系统消息)就不成立了,这时候有没有return,是不是该处理游戏逻辑了喃?如果你非要理解成永远都不断的有系统消息进来需要,也就是说如果你非要写成里面是while(1),恭喜你,你等着被炒吧!!!非MainLoop的死循环,写程序的大忌,难道永远只处理系统消息,你的游戏逻辑不用处理了???
你还理解不到,就写个程序跑一下。真是无语了.....
你不要再回帖了,好好想一下。我现在严重置疑你对代码的阅读能力,以及对中文的理解能力。

PS: MainLoop:是指主循环,即外面的那个while
    非MainLoop:是指非主循环,即里面的那个while
     死循环:退不出来的循环,将导致其他逻辑无法处理。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

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

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

系统消息处理完了,当然要去处理游戏循环了。
所以我才
while(run)
{
      while(有没有系统消息)
      {
             转换并处理系统消息
      }
      游戏循环//注意,游戏循环是“时间计算+操作+渲染”
}
了啊

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

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

xpertsoft在不在啊?

xpertsoft在不在啊?
Devil在吗?

高手们来评评理吧。

0

主题

20

帖子

20

积分

注册会员

Rank: 2

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

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

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

系统消息处理完了,当然要去处理游戏循环了。
所以我才
while(run)
{
      while(有没有系统消息)
  ...


FK,那对于MainLoop是不是“不管有没有系统消息都要处理游戏循环”嘛,你对语言的理解能力就这么差啊,这样的话你还要怎么当程序员啊。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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