游戏开发论坛

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

请问如何控制游戏的速度?

[复制链接]

3

主题

140

帖子

140

积分

注册会员

Rank: 2

积分
140
发表于 2004-4-10 10:54:00 | 显示全部楼层

Re:请问如何控制游戏的速度?

学习。我没考虑过。

0

主题

130

帖子

130

积分

注册会员

Rank: 2

积分
130
发表于 2004-4-10 16:45:00 | 显示全部楼层

Re:请问如何控制游戏的速度?

固定在60FPS很多是因为他的程序在等显示器的垂直扫描回归(VSYNC)

69

主题

450

帖子

473

积分

中级会员

战魂缔造者

Rank: 3Rank: 3

积分
473
QQ
发表于 2004-4-10 18:46:00 | 显示全部楼层

Re:请问如何控制游戏的速度?

游戏不是拿来给变速齿轮用的,请注意

0

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2004-4-10 19:42:00 | 显示全部楼层

Re:请问如何控制游戏的速度?

帧(frame)
===========
你经常可以看到60fps这个值,60fps是隔行电视机的垂直扫描频率。4:3电视机的输出分辨率是640x480,隔行扫描第一次输奇次行(1,3,5。。。),然后是偶数行(2,4,6。。。)。这样,通过60fps的扫描频率,得到30fps的完整图像。为何是30fps呢?因为你的眼睛看30fps的图像就已经足够连续了。当然,刷新频率高,闪烁感就少,所以,现在有100hz的电视机出现。对于显示器,原理是一样的,比如最早期的显示器最最基本的vga模式,恰好是隔行60fps,640x480。

对于你的游戏来说,你的gameloop的基本单位就是frame,在电视游戏(比如ps2),你通常要等一个(或两个)vsync(取决于你是全屏backbuffer还是半屏backbuffer),也就是从顶到底垂直扫描一次的时间。

在DX中,也有VSync的概念,在create device的时候,你可以在present param中指定。不过,有的显卡可能不支持。

所以,你应该让你的游戏是在一定的fps下运行的。假设是60fps,即每个loop,如果在1/60秒内结束,你在loop的最后,等到1/60秒。实现很简单,在loop的start,取得当前时间,在end时,取一下差。

基于帧的时间计算
===========
这是一种比较简单的时间计算方式,不是最好的,但是,对你的游戏应该是适用的。
  首先,你的游戏有fps控制,比如60fps,那么时间单位就是1/60秒。
  其次,你有一个全局的FrameCounter,时间的计算基于FrameCounter。

注意:
  同一frame内,时间是一样
  有累计误差,不过,对你来说时无所谓的。

13

主题

60

帖子

60

积分

注册会员

Rank: 2

积分
60
发表于 2004-4-12 10:13:00 | 显示全部楼层

Re:请问如何控制游戏的速度?

哈哈:
   其实你的游戏如果算法好,根本没必要控制时间,快不是好事吗?

0

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2004-4-12 10:43:00 | 显示全部楼层

Re:请问如何控制游戏的速度?

不尽然,因为显示器刷新是固定频率的,如果在vsync的中间更新显示内容,如果场景是快速移动的(比如camera在转动),那么在垂直扫描没有结束的时候,扫描的source buffer内容被更新了。这样就会出现撕裂,这就是为什么绝大部分游戏,都是在vsync之后刷新front buffer

1

主题

17

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2004-4-12 13:43:00 | 显示全部楼层

Re:请问如何控制游戏的速度?

有必要,关注,大家请继续提供.

3

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2004-4-13 22:32:00 | 显示全部楼层

Re: Re: Re: Re:请问如何控制游戏的速度?

crazyjim: Re: Re: Re:请问如何控制游戏的速度?

发生了一件奇怪的事情,当我设定刷新间隔在15ms以下时,帧数一般是60-66帧,但是我将刷新间隔设定在16ms或以...


如果你是用timeGetTime()计算得时间,可以换成QueryPerformanceFrequency()、QueryPerformanceCounter()试试;如果不是,下面就不用看了。

我遇到了和你一样的问题,就是这么解决的。我估计可能是timeGetTime()的精度也不够高,比较小的时间间隔无法分辨。

我调试的情况是这样的(仅供参考):
大概15ms绘制完一帧,间隔设置为15ms以下时,每帧的耗时不会低于15ms,这时限制帧数的代码不起作用,所以帧数是对的。而设置为16ms或以上时,绘制完一帧后要循环等待,等待间的间隔很小(因为不用进行绘制),可能timeGetTime()无法分辨(因为我试了用timeGetTime()获取时间相减求等待间隔的结果总是0),这样这一帧的耗时总是停留在15ms,不会递增。循环等待了一会后,计算的帧耗时会突然跳到30ms,超出15ms了,可以接着进行下一帧的绘制。这么一算,每30ms绘制一帧,帧数自然就会比15ms的减半了。
如果问题出在这儿,你可以试着把间隔设成31ms,帧数会变成22;至于为什么会出这种问题,或者是不是问题可能出在其它方面,我就不太清楚了。比较怪的是,在我机子
上有时候会出这种问题,有时候却是正常的,不知道怎么回事。

2

主题

10

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2004-4-14 10:14:00 | 显示全部楼层

Re:请问如何控制游戏的速度?

其实如果想控制游戏速度.是不用用帧来做参照体的..因为帧在不同机器,不同显示下不是恒定的.参照物要用恒定的东东,就是时间.

其实没必要去刻意控制帧数.就算要控制,就应该用上面朋友的方法
if (大于你设置的最小时间,可以画了)
  画
else
做别的或者什么也不做.

12

主题

40

帖子

40

积分

注册会员

Rank: 2

积分
40
发表于 2004-6-26 22:02:00 | 显示全部楼层

Re: 请问如何控制游戏的速度?

请问这里static DWORD steptime = 1000/60,是定义的刷新频率吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-2 14:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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