游戏开发论坛

 找回密码
 立即注册
搜索
查看: 24124|回复: 64

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

[复制链接]

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2007-5-21 16:23:00 | 显示全部楼层 |阅读模式
NEHE的循环如下:
while(run)
{
  if(有没有系统消息)
  {
    转换并处理系统消息
  }

  else
  {
    游戏循环
  }
}
----------------------
如果系统突然有100个系统消息,那么这个循环会做什么呢?
答案: 100次 while(run) 再加 100次 if(有没有系统消息){转换并处理系统消息}

为什么NEHE要设计成这个结构呢?
有必要运行100次的while(run)吗?
只处理100次的{转换并处理系统消息}不就OK了吗?

思考一下,有没有一种方法可以把效率提得更高?

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-5-21 17:04:00 | 显示全部楼层

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

100个消息就100次~小卡一下~100次似乎不爽正常现象~不正常当然应该卡一下~

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

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

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

funcman: Re:讨论:效率最高的游戏循环,怎么写?
100个消息就100次~小卡一下~100次似乎不爽正常现象~不正常当然应该卡一下~

你这么写,就是承认你做编不出更高效率的代码喽?
明白了。

16

主题

114

帖子

114

积分

注册会员

Rank: 2

积分
114
发表于 2007-5-22 09:05:00 | 显示全部楼层

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

run标志一下游戏循环,是个非常轻量级的判断开销,带来的是不错的可读性和编程方便。
不要从这些地方去专牛角尖,肯定有更重要的地方要你去优化。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

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

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

那么,如下修改,速度是不是更快呢?
while(run)
{
  while(有没有系统消息)
  {
    转换并处理系统消息
  }

  游戏循环
}

29

主题

224

帖子

224

积分

中级会员

Rank: 3Rank: 3

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

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

画面卡住了

32

主题

108

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2007-5-22 16:41:00 | 显示全部楼层

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

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

那么,如下修改,速度是不是更快呢?
while(run)
{
  while(有没有系统消息)
  {
    转换并处理系统消息
  }

  游戏循环
}

采用nehe的结构,有系统消息的时候不进入游戏循环,但是按你的这个结构,不管有没有消息都要进入游戏循环

95

主题

1089

帖子

3301

积分

论坛元老

Rank: 8Rank: 8

积分
3301
QQ
发表于 2007-5-22 17:09:00 | 显示全部楼层

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

免费教一招:大家知道一次渲染的时间可以做很多事情,而且渲染频率不用那么高,少画几次没关系的,只要保证足够的刷新率就够了,但是消息是一定要处理的,有了多余的时间操作系统就可以处理其他事情,这样操作系统不繁忙游戏当然就不卡了,既然这样,看我的:
while(run)
{
  if(有没有系统消息)
  {
    转换并处理系统消息
  }

  else
  {
    if(离上次“游戏循环”大于0.1秒)
    {
      游戏循环
    }
  }
}

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

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

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

iron: Re: Re:讨论:效率最高的游戏循环,怎么写?
采用nehe的结构,有系统消息的时候不进入游戏循环,但是按你的这个结构,不管有没有消息都要进入游戏循环

while(有没有系统消息)
  {
    转换并处理系统消息
  }
怎么可能“不管有没有消息都要进入游戏循环”呢?

你没学过 while(条件) 这个语句吗?

while的作用:
条件满足,就执行,然后有回来。
如果不满足条件,就不运行。

小兄弟C++练得不到家呀

0

主题

20

帖子

20

积分

注册会员

Rank: 2

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

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

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

那么,如下修改,速度是不是更快呢?
while(run)
{
  while(有没有系统消息)
  {
    转换并处理系统消息
  }

  游戏循环
}


你才要好好学习一下哦!!你写的是两个while,为什么不可能“不管有没有消息都要进入游戏循环”。自己写的都看不懂哈?
不过这样写没错!本来就应该“不管有没有消息都要进入游戏循环”,因为有些逻辑处理并有“系统消息”来就可以不处理的,难道非要等到下一个loop来处理吗?
效率最高是怎么定义?是每个loop跑的时间最短就效率最高吗?错了,效率是指你每个loop中在固定的时间内做尽可能多的事情,固定的时间是为了保证你有一个比较平滑的帧数:
while( true )
{
        if( 有系统消息 )
        {
               处理系统消息
        }

        if( 离上次“游戏循环”大于0.1秒 )
        {
               游戏循环
        }
        else
        {
               sleep(1); // 你不想一run就把CPU占满的话,就要加这个!!!
        }
}
这样就可以了,如果照你之前的设计,当连续有10000个系统消息来,且先不管这些消息的时间间隔,你是不是要一直把这10000个系统消息都处理完才来处理游戏逻辑喃?

如果你真的对你所谓的效率实在是在乎得不得了,请用多线程,另外搭双CPU,或者双核的CPU,然后把处理系统消息与处理游戏循环分开用不同的线程来做。
实在还不行,好好学习一下,用计算机集群吧,不过估计你这个问题也用不上.....
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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