游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3521|回复: 4

发现最近很多关于游戏速度控制的问题,这里建议2个方

[复制链接]

6

主题

74

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
发表于 2004-4-25 22:21:00 | 显示全部楼层 |阅读模式
第一个是限制fps,如固定为60fps。这样每次游戏循环可以通过一int计数来控制动画效果。当实际运行fps不能达到期望的fps时,游戏世界时间比现实时间运行慢。
方法无非是:
a.用flip()来同步垂直刷新(需设置刷新率,如果用户使用了刷新率超频的话,游戏速度会与预期有差别)
b.用while(1)+计时,很占用cpu时间,但速度控制很好。
c.用waitabletimer的event方式,等待时针信号时线程会挂起,cpu消耗较小。缺点是精度比较低,只能到1/60左右.这里是以前写的东西,可以参考一下。http://www.csdn.net/Develop/read_article.asp?id=10590

第二个是不限制fps,用每次循环消耗的现实时间来做计算。这样可以做到游戏运行速度固定,与fps无关。缺点是如果fps较低的话,游戏很难控制。

典型的fps都是用这种方式运行的(如q3/ut)
写点代码解释: 假设一个横版射击游戏,设控制的obj移动速度为30pixel/s
游戏主循环:      
clock_t t1,t2;
t1=clock();
while(1){
clock_t t3=clock();
t2=t3-t1;
t1=t3;
LPBYTE in=getinput();
if(in[KEY_LEFT])
obj.x-=30*t3/1000;
......

drawobj();
};


再某些情况下,如果t3太高(fps太低)可能游戏运行会有我们不希望的结果。
设想如果有个子弹移动速度为100pixel/s,obj大小为40.那么在t3=1000时很可能出现
在t=t0 和t=t0+t3的时间点,子弹都不穿过obj,而在t= t0+ tx(0<tx<t3)时相交。
这样就造成了本来会被打掉的东西其实未计算到伤害。(因为实际游戏运行都是时间点,而不可能是连续的线)

5

主题

255

帖子

255

积分

中级会员

Rank: 3Rank: 3

积分
255
发表于 2004-4-25 22:38:00 | 显示全部楼层

Re:发现最近很多关于游戏速度控制的问题,这里建议2个方

学习

2

主题

23

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2004-4-26 11:30:00 | 显示全部楼层

Re:发现最近很多关于游戏速度控制的问题,这里建议2个方

第一种适合单机
第二种适合联机

4

主题

29

帖子

41

积分

注册会员

Rank: 2

积分
41
发表于 2004-4-27 12:45:00 | 显示全部楼层

Re:发现最近很多关于游戏速度控制的问题,这里建议2个方

PC基本用第二种,游戏机用第一种的多,毕竟电视是隔行60HZ的场频。

15

主题

1268

帖子

1268

积分

金牌会员

Rank: 6Rank: 6

积分
1268
发表于 2004-4-27 18:10:00 | 显示全部楼层

Re:发现最近很多关于游戏速度控制的问题,这里建议2个方

其实还有一种折中方案:
限制最高向下适应的方式
据体为,时间单位不是毫秒而是 微时间片
每次检测时,计算上一帧时间与当前时间之差,再除以微时间片大小得到时间片间隔数
然后处理方法同绝对时间法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-1 22:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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