AS3中帧速控制
2008-10-09 13:56 宝宝合凤凰 阅读(693) 评论(0) 收藏 举报AS3中帧速控制
新官上任,得放点火。但是小弟不才,写个简单的教程先。
希望大家有关游戏编程的问题、教程、心得都来游戏编程讨论区发帖,本人特喜欢送银两。
本教程由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帧每秒。实际帧速就会有提升了。
来看代码:
希望大家有关游戏编程的问题、教程、心得都来游戏编程讨论区发帖,本人特喜欢送银两。
本教程由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帧每秒。实际帧速就会有提升了。
来看代码:
复制内容到剪贴板
[ 本帖最后由 wizim 于 2008-3-8 16:58 编辑 ]代码:
const FRAMERATE=stage.frameRate//将初始帧速保存为常量,即期望每秒帧数
var frameNum=0;//定义帧数计数器,每次enterframe都会使之自加1
var oldFrameNum=0;//1秒前的帧数计数器的值,这样可以计算出1秒内过了多少帧。
var errFrameNum=0;//最后看才知道干什么用,现在先不关他。
/*
*定义一个文本框来显示一些数值
*/
var tf=new TextField()
addChild(tf);
tf.x=200;
tf.y=200;
tf.autoSize=TextFieldAutoSize.CENTER;
/*
*定义一个计时器,1000毫秒也就是1秒钟会运行一次timerHandle函数
*/
var myTimer= new Timer(1000);
myTimer.addEventListener(TimerEvent.TIMER, timerHandle);
myTimer.start();
/*
*每帧都要做的事情 是什么呢?看看enterFrameHandle函数里,只是把frameNum++;
*/
addEventListener(Event.ENTER_FRAME,enterFrameHandle);
/*
*以下函数一秒钟执行一次。
*/
function timerHandle(e:*)
{
var frameNumPerSec=frameNum-oldFrameNum;//此时的总帧数减去上一秒的帧数就是这1秒走过的帧数,也就是实际帧速
oldFrameNum=frameNum;//把现在的帧数保存下来,作为下一秒的oldFrameNum
if(frameNumPerSec>FRAMERATE)//实际帧速大于期望帧速的时候我们要做一些处理
{
stage.frameRate-=(frameNumPerSec-FRAMERATE)//将设定帧速降低,降低多少就要看实际帧速与期望帧速差多少了
}else if(frameNumPerSec<FRAMERATE)//同理
{
stage.frameRate+=(FRAMERATE-frameNumPerSec)
}
tf.text="帧速设定值"+String(stage.frameRate)+",实际帧速"+String(frameNumPerSec);//显示到文本框中
/*
*总不能设定帧速都上万了,实际帧数还不能达到期望吧。以下代码为了避免这种情况。
*/
if(frameNum>1000 && (frameNumPerSec<FRAMERATE-10||frameNumPerSec>FRAMERATE+10||stage.frameRate>FRAMERATE+30||stage.frameRate<FRAMERATE-30))//从1000帧以后再检测,因为刚打开flash的时候就是有些卡的。
{
if(++errFrameNum>=5)
{
trace("您的计算机不能为此游戏保持稳定的帧速\n请关闭一些软件或者到官方网站下载exe版本")
stage.removeChildAt(0);
removeEventListener(Event.ENTER_FRAME,enterFrameHandle);
myTimer.removeEventListener(TimerEvent.TIMER, timerHandle);
errFrameNum=0;
}
}else{
errFrameNum=0;
}
}
function enterFrameHandle(e:*)
{
frameNum++;
}附件
framerate.rar (21.95 KB)
-
2008-3-8 16:56, 下载次数: 19
浙公网安备 33010602011771号