游戏开发论坛

 找回密码
 立即注册
搜索
查看: 17999|回复: 10

如何锁定帧数(锁帧)

[复制链接]

54

主题

116

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2007-11-9 17:17:00 | 显示全部楼层 |阅读模式
在窗口模式下控制个角色运动,速度都很正常。可是全屏后,角色运动速度奇快。感觉可能和全屏后每秒帧数暴涨有关系,如何保证窗口和全屏的时候角色运动速度相当呢? 听说有的游戏开发的时候用到了“锁帧”的方法
请问这又如何实现?

谢谢了

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-11-9 17:30:00 | 显示全部楼层

Re:如何锁定帧数(锁帧)

相邻2帧之间的时差控制一下。

  1. while( true ){
  2.     dt= now - lastDraw;
  3.     if( dt >= T ){
  4.         draw();
  5.         lastDraw= now;
  6.     }
  7. }
复制代码

54

主题

116

帖子

122

积分

注册会员

Rank: 2

积分
122
 楼主| 发表于 2007-11-9 17:35:00 | 显示全部楼层

Re:如何锁定帧数(锁帧)

谢谢,这个T代表什么呢

22

主题

144

帖子

193

积分

注册会员

Rank: 2

积分
193
发表于 2007-11-9 17:38:00 | 显示全部楼层

Re:如何锁定帧数(锁帧)

很简单:
DWORD time_before=GetTickCount();

GameMain();//a pipeline frame

DWORD time_now=GetTickCount();

if(time_now-time_before>=33){ //30fps
       Sleep(time_now-time_before);
}

这是最简单的方法,只能减速,不能像warcraft那样的丢帧处理慢速机器.

54

主题

116

帖子

122

积分

注册会员

Rank: 2

积分
122
 楼主| 发表于 2007-11-9 17:49:00 | 显示全部楼层

Re: Re:如何锁定帧数(锁帧)

sjinny: Re:如何锁定帧数(锁帧)

相邻2帧之间的时差控制一下。
[code]
while( true ){
    dt= now - lastDraw;
    if( dt >= T ){
...

把T设为1/60 这个方法使用后蓝屏了,没有渲染出来

54

主题

116

帖子

122

积分

注册会员

Rank: 2

积分
122
 楼主| 发表于 2007-11-9 17:52:00 | 显示全部楼层

Re: Re:如何锁定帧数(锁帧)

flarez: Re:如何锁定帧数(锁帧)

很简单:
DWORD time_before=GetTickCount();

GameMain();//a pipeline frame

DWORD time_now=GetTi...


time_now-time_before算出来的是渲染两帧之间的间隔时间,不是每秒渲染帧数,不可能大于30啊

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-11-9 17:52:00 | 显示全部楼层

Re:如何锁定帧数(锁帧)

now是执行到这里时的当前时刻
lastDraw是上一次绘制的时刻
dt是时间差

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-11-9 17:56:00 | 显示全部楼层

Re:如何锁定帧数(锁帧)

我再解释一下吧
基本的思想就是,让draw()按照特定的频率执行,那么帧数就得到了控制,所以在执行draw()之前需要先判断一下当地时刻,判断一下是否应该draw()了。

汗,忘了说T了:
T= ( 1.0 / fps ) * 1000;//换算为毫秒
这是相邻2帧之间应该保持的时间差

22

主题

144

帖子

193

积分

注册会员

Rank: 2

积分
193
发表于 2007-11-9 18:07:00 | 显示全部楼层

Re:如何锁定帧数(锁帧)

算法失误,写错了,是小于,抱歉抱歉,烦了个低级错误。

20

主题

136

帖子

172

积分

注册会员

Rank: 2

积分
172
发表于 2007-11-9 20:33:00 | 显示全部楼层

Re:如何锁定帧数(锁帧)

Sleep的精度大概是55毫秒
这样的精度怎么可以拿来做实时程序的定时器。

我两年前实现的可行的算法是这样的:先给Sleep大概一个合适的毫秒数,并采集近10桢的平均桢频,并根据平均桢频的大小线性修改Sleep的毫秒数,便可以相对稳定地得到定义的桢频。

因为这种算法工作得不错,所以更精确的定时器暂时没有去研究。

希望对你有帮助。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-18 21:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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