游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2483|回复: 7

【小白的分享贴】fps控制

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2009-12-31 15:51:00 | 显示全部楼层 |阅读模式
首先这个东东里的内容值得一读:
http://paco.dev-zone.se/win32_timing/timing.html
重点:
1.fps足够之后,再上升就是对系统资源的浪费,不管是客户端还是服务器都不能假设整个电脑都只用来运行一个程序,所以需要做fps控制
2.当机器性能足够时,一帧的实际运行实际会比预期fps对应的预期周期短,这样会有一段时间我们不需要运行游戏的渲染和逻辑(没事干了)
3.当没事干的时候,需要用不占用系统资源或尽量少占资源的方式等待
4.win下使用Sleep()可以让一个线程进行等待,并且等待过程中不占什么资源
5.Sleep()的精度是有限的,也就是说一般情况下Sleep(1)实际并不会等待1毫秒,而可能是10毫秒
6.win下使用timeBeginPeriod()/timeEndPeriod()可以改变Sleep()的精度,但是这精度最高也只有1到2毫秒
7.当需要等待时,如果需要等待的时间超过了Sleep的精度,那么就可以先Sleep,等醒来再检查时间;如果需要等待的时间少于Sleep的精度,就是用一个循环进行忙等待
8.当给Sleep的参数为0时,含义是放弃CPU时间片,所以在忙等待的时候调用Sleep(0)会比较好
9.每一帧开始之前都要检查当前时间,如果距离上一帧的开始时间太近那么就要等待,这个时间检查在win下用GetTickCount不如用timegettime,用timegettime不如用QueryPerformanceCounter


  1. // 伪代码:
  2. int main(void)
  3. {
  4.     ...;
  5.     Time lastTime;
  6.     for( bool running= true; running; ){
  7.         for( bool waiting= true; waiting; ){
  8.             Time now= getTimeNow();
  9.             Time dt= now - lastTime;
  10.             Time expectedTime= 1.0 / fps;
  11.             if( expectedTime > dt ){
  12.                 Time timeToSleep= expectedTime - dt;
  13.                 if( timeToSleep > precision ){
  14.                     Sleep( timeToSleep - precision ); // 减去Sleep的精度是为了防止一觉醒来发现睡过了头
  15.                 }else{
  16.                     Sleep( 0 );
  17.                 }
  18.             }else{
  19.                 waiting= false;
  20.             }
  21.         }
  22.         lastTime= getTimeNow();
  23.         ...;
  24.     }
  25.     ...;

  26.     return 0;
  27. }
复制代码

1

主题

196

帖子

196

积分

注册会员

Rank: 2

积分
196
发表于 2009-12-31 15:55:00 | 显示全部楼层

Re:【小白的分享贴】fps控制

一个完全看不懂的策划路过

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2009-12-31 23:55:00 | 显示全部楼层

Re:【小白的分享贴】fps控制

这个太入门了吧

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2010-1-1 10:19:00 | 显示全部楼层

Re:【小白的分享贴】fps控制

3楼的代码里压根就没有Sleep之类的调用,完全就是忙等待……
4楼请看标题……

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2010-1-1 12:00:00 | 显示全部楼层

Re:【小白的分享贴】fps控制

难得看到几个老面孔,顶一下

0

主题

43

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2010-1-2 22:57:00 | 显示全部楼层

Re:【小白的分享贴】fps控制

学习了,请问楼主precision的精度一般是好多喃?

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2010-1-3 19:31:00 | 显示全部楼层

Re:【小白的分享贴】fps控制

目前是1……因为需要尽量精确的Sleep……以后如果发现这样有问题要调整也很容易

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2010-2-11 14:29:00 | 显示全部楼层

Re:【小白的分享贴】fps控制

小小白学习了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-14 13:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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