游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8706|回复: 20

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

[复制链接]

9

主题

22

帖子

40

积分

注册会员

Rank: 2

积分
40
发表于 2004-4-7 16:31:00 | 显示全部楼层 |阅读模式
我编了一个简单的小游戏,用了clock()函数来控制游戏每帧的时间,现在是这样的:如果这一帧渲染所用的时间少于16.6ms(就是为了图个60帧)则用Sleep()函数来拖延至16.6ms。但是这样做出现了一个奇怪的现象,这个程序在两台不同的电脑上运行的速度不同,在一台配置较好的机器上会出现一定的变慢和跳帧的感觉(大概就是有轻微的一顿一顿现象)。我猜可能是因为好的那台好的机器渲染时间短,调用了Sleep()函数造成的。所以想请问高人,如何控制游戏速度,使其在每台机器上运行的速度一样。还有,为什么许多2D游戏的帧数都是60帧?

11

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2004-4-7 16:58:00 | 显示全部楼层

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

我在游戏中不使用Sleep来控制速度
Sleep会造成线程挂起,可能会导致游戏不流畅
所以如果时间没到,就不渲染就可以了

11

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2004-4-7 17:01:00 | 显示全部楼层

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

还有,要想精确的控制时间,最好不要使用GetTickCount(),精度不够
使用timeGetTime就相对精确多了

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20527
发表于 2004-4-7 17:03:00 | 显示全部楼层

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

可以用timeGetTime()函式来获取一个机器时间,每次循环都进行时间差计算,然后根据时间差来判断是否应该延时等待。

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-4-7 18:47:00 | 显示全部楼层

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

while(1){
  if (PeekMessage(&msg,0,NULL,NULL,PM_REMOVE)){
    DispatchMessage(&msg);
        if (msg.message == WM_QUIT) {
           _TRACE("GameEngine正常退出\n");
          return 0;
       }
   }else{
      i64_CurrentTime = _GetSystemTime();
      if (i64_CurrentTime >= i64_NextTime ){
         i64_SkipTime = i64_CurrentTime - i64_NextTime;
         i64_NextTime = i64_CurrentTime + m_FPSdelay - i64_SkipTime;
         if (i64_NextTime < i64_CurrentTime) i64_NextTime = i64_CurrentTime + m_FPSdelay;
        m_FPS++;
                               
        RefreshData();
        ProcessData();

        Draw = true;

        OutputData(true);
    }
}
我的这样做的.
说明:_GetSystemTime()是自已写的函数,返回一个64位的整数,Sleep()函数的调用放在了OutputData()里。

9

主题

22

帖子

40

积分

注册会员

Rank: 2

积分
40
 楼主| 发表于 2004-4-7 20:29:00 | 显示全部楼层

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

感谢楼上各位高手,问题解决了

9

主题

22

帖子

40

积分

注册会员

Rank: 2

积分
40
 楼主| 发表于 2004-4-7 22:21:00 | 显示全部楼层

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

发生了一件奇怪的事情,当我设定刷新间隔在15ms以下时,帧数一般是60-66帧,但是我将刷新间隔设定在16ms或以上时,帧数就骤降为30多帧,这让我实在无法理解,我增加了刷新间隔反而令帧数下降了整整一半。刷新间隔为15ms时一秒最多能渲染66帧,这个没问题,设为16ms后,按正常情况肯定能保持在58帧,但是帧数少了一半,想不通了……
我将这个程序放到别人了机器上运行好像没问题,有50帧,大概是他的机器不太行。哪位高人能给予解答

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-4-7 22:42:00 | 显示全部楼层

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

如果你调用了Sleep来释放时钟周期的话,要注意的是:SLEEP()不一定能够准确的按照你指定的时间来暂停一个线程,可能暂停的时间比你指定的更多或是更少。需要把这一点考虑进去。

69

主题

450

帖子

473

积分

中级会员

战魂缔造者

Rank: 3Rank: 3

积分
473
QQ
发表于 2004-4-9 11:01:00 | 显示全部楼层

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

直接用获取一次循环需要得时间(在我xp1600+D3D上是2),然后在游戏内部就使用这个时间作为基准,比如游戏人物要移动,则x+=FrmInterval/x,X是一个参量,决定移动速度
这样,无论在窗口下,还是全屏下都可以保证速度统一,而且效率较高,这是D3D程序得普遍做法

38

主题

96

帖子

148

积分

注册会员

Rank: 2

积分
148
发表于 2004-4-9 23:22:00 | 显示全部楼层

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

不能用这个,用这个变速齿轮不好。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-2 13:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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