[教程] AS3中帧速控制

原文地址:http://bbs.9ria.com/viewthread.php?tid=4122

新官上任,得放点火。但是小弟不才,写个简单的教程先。
希望大家有关游戏编程的问题、教程、心得都来游戏编程讨论区发帖,本人特喜欢送银两。

 

本教程由WiZiM(wizim404.com)原创于bbs.actionscript3.cn论坛。
博客地址:wizim.actionscript3.cn
转载请注明出处.若有问题和意见请发邮件给我:wzm92[at]yahoo.com.cn

我等游戏爱好者最困扰的事情就是flash在浏览器中的帧速。他总比在本地播放器中的播放的帧速慢10%-40%。有的玩家帧速快,有的玩家帧速慢,尤其影响flash联网游戏的公平性。
早在as2时代,前辈们发现在html中改变wmode属性来改善帧速(挺有用的,和本地播放器播放差不多快了,详细内容:http://nextframe.jp/fpsCheck/fpsCheck.htm),但是呢,我们做的游戏会被很多网站转载,我们能控制自己网站的wmode,不能控制其他网站的wmode啊。而且wmode有个致命的缺点就是按方向键会使网页的发生滚动。这样游戏中就要不得不使用wsad按键方案,很多玩家会感到不适应。

as3时代来临了,我们有了更好的办法控制帧速了。没错就是stage.frameRate!
我们现在可以运行时动态改变flash的帧速了,比如你帧速是30帧每秒,但是实际是23帧每秒。我们就设定他帧速为37帧每秒。实际帧速就会有提升了。
来看代码

  1. const FRAMERATE=stage.frameRate//将初始帧速保存为常量,即期望每秒帧数
  2. var frameNum=0;//定义帧数计数器,每次enterframe都会使之自加1
  3. var oldFrameNum=0;//1秒前的帧数计数器的值,这样可以计算出1秒内过了多少帧。
  4. var errFrameNum=0;//最后看才知道干什么用,现在先不关他。
  5. /*
  6. *定义一个文本框来显示一些数值
  7. */
  8. var tf=new TextField()
  9. addChild(tf);
  10. tf.x=200;
  11. tf.y=200;
  12. tf.autoSize=TextFieldAutoSize.CENTER;
  13. /*
  14. *定义一个计时器,1000毫秒也就是1秒钟会运行一次timerHandle函数
  15. */
  16. var myTimer= new Timer(1000);
  17. myTimer.addEventListener(TimerEvent.TIMER, timerHandle);
  18. myTimer.start();
  19. /*
  20. *每帧都要做的事情 是什么呢?看看enterFrameHandle函数里,只是把frameNum++;
  21. */
  22. addEventListener(Event.ENTER_FRAME,enterFrameHandle);
  23. /*
  24. *以下函数一秒钟执行一次。
  25. */
  26. function timerHandle(e:*)
  27. {
  28.         var frameNumPerSec=frameNum-oldFrameNum;//此时的总帧数减去上一秒的帧数就是这1秒走过的帧数,也就是实际帧速
  29.         oldFrameNum=frameNum;//把现在的帧数保存下来,作为下一秒的oldFrameNum
  30.         if(frameNumPerSec>FRAMERATE)//实际帧速大于期望帧速的时候我们要做一些处理
  31.         {
  32.                 stage.frameRate-=(frameNumPerSec-FRAMERATE)//将设定帧速降低,降低多少就要看实际帧速与期望帧速差多少了
  33.         }else if(frameNumPerSec<FRAMERATE)//同理
  34.         {
  35.                 stage.frameRate+=(FRAMERATE-frameNumPerSec)
  36.         }
  37.         tf.text="帧速设定值"+String(stage.frameRate)+",实际帧速"+String(frameNumPerSec);//显示到文本框中
  38.        
  39.         /*
  40.           *总不能设定帧速都上万了,实际帧数还不能达到期望吧。以下代码为了避免这种情况。
  41.           */
  42.         if(frameNum>1000  && (frameNumPerSec<FRAMERATE-10||frameNumPerSec>FRAMERATE+10||stage.frameRate>FRAMERATE+30||stage.frameRate<FRAMERATE-30))//从1000帧以后再检测,因为刚打开flash的时候就是有些卡的。
  43.         {
  44.                                
  45.                 if(++errFrameNum>=5)
  46.                 {
  47.                         trace("您的计算机不能为此游戏保持稳定的帧速\n请关闭一些软件或者到官方网站下载exe版本")
  48.                         stage.removeChildAt(0);
  49.                         removeEventListener(Event.ENTER_FRAME,enterFrameHandle);
  50.                         myTimer.removeEventListener(TimerEvent.TIMER, timerHandle);
  51.                         errFrameNum=0;
  52.                 }
  53.                                
  54.         }else{
  55.                 errFrameNum=0;
  56.         }
  57.                        
  58.        
  59. }
  60. function enterFrameHandle(e:*)
  61. {
  62.         frameNum++;
  63. }
复制代码

framerate.rar(21.95 KB) 

posted @ 2010-06-13 22:28  rob_2010  阅读(665)  评论(0编辑  收藏  举报