游戏开发论坛

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

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

[复制链接]

2

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2007-6-7 10:40:00 | 显示全部楼层

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

我是说,假如 msg = 100, 物里是O(nlog(n)),rendering是O(nlog(n))

O(100)+O(nlog(n))+O(nlog(n)) = O(nlog(n))

20

主题

222

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2007-6-17 22:20:00 | 显示全部楼层

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

lz你真是掀起了钻牛角尖的狂潮啊,可惜你却先认栽了,我顶你,哈哈,你的实现比NEHE的效率高

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

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

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

“认栽”是什么意思?
BAIDU搜索,也没查到“认栽”是什么意思。
到底是什么意思?

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2007-7-11 17:27:00 | 显示全部楼层

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

呵呵,你C语言不过关。

你说
“我们设想一下,你操作足够快,是不是有可能消息来得很快,你处理一个,又来一个....就这样你的程序卡在while(hasmsg)这里了”

那么按照同样的道理
我们设想一下,你操作足够快,是不是有可能消息来得很快,你处理一个,又来一个....
就这样NEHE的程序同样也会只运行if(有消息){处理消息}这里,而不去渲染了

21

主题

136

帖子

165

积分

注册会员

Rank: 2

积分
165
发表于 2007-7-11 21:14:00 | 显示全部楼层

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

不好意思,看错了[em6]
......
我的:
while(Game.IsActive())
{
  if(hasMsg())
   {
    处理一个消息
   }
  Game.run()
}
也就是说每次只处理一个消息(如果有的话),每次都进入游戏循环

改进的:
处理完一个消息时可以判断一下时间,如果还有充足时间,可以进入游戏刷新一下,或者预处理下一贞,不够就直接返回了

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2007-7-12 16:08:00 | 显示全部楼层

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

yjlh1234: Re:讨论:效率最高的游戏循环,怎么写?
while(Game.IsActive())
{
  if(hasMsg())
   {
    处理一个消息
   }
  Game.run()
}
也就是说每次只处理一个消息(如果有的话),每次都进入游戏循环

如果玩家想向“右上 45度方向”移动,所以同时按下“上”和“右”键。
结果会怎么样呢?

键盘上只能一次传一个消息的,所以消息队列里会添加以下两条消息:
第一条消息:玩家按了“上”
第二条消息:玩家按了“右”


你的程序会这样的。
对“上”键做出反应,先向上走一步,渲染,
然后对“右”做出反映,再向45度方向走,渲染。

而我的程序会这样。
一次性地对“上”和“右”做出反映,直接向45度方向走,渲染。

很明显,我的代码更符合玩家的操作。
------------------------------
还有,如果玩家同时按了6个键,会怎么样呢?
由于你的程序是“每次渲染都只能处理 1个消息”,
所以要等到第 6帧画面的时候才能对玩家的操作完全的做出反应
如果画面渲染速度是30帧/秒,就要等待 0.2秒才能做出反应。
(完全不可能做成动作游戏。动作游戏的反映速度绝对不可以超过0.1秒。)

而我的,在第一帧就完全按照玩家的操作做出反应。
(反映时间是1/30=0.033秒)
--------------------------------------------
你觉得 NEHE 的循环比你的还差吗?

21

主题

136

帖子

165

积分

注册会员

Rank: 2

积分
165
发表于 2007-7-13 15:26:00 | 显示全部楼层

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

你的只有30fps
我的至少有70fps哦
而且,我很确定的说:不卡!真的不卡!
比如:处理格斗游戏中的连招系统,这个消息够多了吧!
比如:"上上下下"是一个招吧
你得到"上"不能处理吧,先存到自己的动作指令链中,然后结合当前消息链的情况,看能不能构成一个完整的指令!如果能,翻译,执行,当超过一定数量时,就会删除一些无效消息,防止消息堆积
我是把消息全部翻译成自己的动作指令,然后根据指令链的情况,渲染.
再想你说的,要是你本来都没有斜走这个指令,分解成上,右两个又有何妨?!
如果有的话,在接受到一个"上"时,根本就不会处理,而是加入到自己的消息链等待下一个,如果超过等待时间,"上"被翻译成上指令,如果等到"右",就会根据当前消息链中的消息翻译成"斜右上"
//----------------
为什么不用你那种方式呢?
街机格斗游戏中,高手连招时,有种情况,叫提前输入,就是他已经把好多的指令都输入了,但是此时还是以前的画面
如果你处理了很多消息,自己想像画面的跳跃性变化,fps的变化
//----------
我也不是说我的就好,只是够用了,而且,它确实工作得很好,只是维护自己的消息和指令链,需要花些时间,不过完善的输入系统对游戏确实很重要
//---------
恩,多说无益了...

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2007-7-13 16:28:00 | 显示全部楼层

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

FPS 70?
我玩《魔兽世界》,人多的时候 FPS 会降到 12

你为什么喜欢“每一次渲染,最多只处理 1个系统消息”呢?
你做 RPG 游戏吗?

27

主题

418

帖子

455

积分

中级会员

Rank: 3Rank: 3

积分
455
QQ
发表于 2007-7-24 01:01:00 | 显示全部楼层

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

错过了最热闹的时候,遗憾啊~~~~~~~


不过,可以肯定的是,LZ没有写过真正的游戏,至少连个完整的小游戏也没写过。
如果你写过DirectInput的程序,就不会说出按 上 和按 右 是两个消息了。

27

主题

418

帖子

455

积分

中级会员

Rank: 3Rank: 3

积分
455
QQ
发表于 2007-7-24 01:06:00 | 显示全部楼层

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

哦,还有NeHe的Demo只是教你怎么用OGL,不是教你如何写出高效的游戏程序。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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