防止卡帧的办法

[Event(name="tick",type="TickEvent")] /** * 这个类提供了发布ENTER_FRAME事件的功能,唯一的区别在于在发布的事件里会包含一个interval属性,表示两次事件的间隔毫秒数。 * 利用这种机制,接收事件方可以根据interval来动态调整动画播放间隔,单次移动距离,以此实现动画在任何客户机上的恒速播放, * 不再受ENTER_FRAME发布频率的影响,也就是所谓的“跳帧”。 * * * * 相比其他同样利用getTimer()的方式,这种方法并不会进行多余的计算。 * * * */ public class Tick extends EventDispatcher { private static var _instance:Tick=null; private var displayObject:Sprite;//用来提供事件的对象 private var prevTime:int;//上次记录的时间 static public function get instance():Tick { if(_instance==null) _instance=new Tick(); return _instance; } /** * 全局默认帧频 */ static public var frameRate:Number = NaN; /** * 最大两帧间隔(防止待机后返回卡死) */ static public var MAX_INTERVAL:int = 300; /** * 速度系数 * 可由此实现慢速播放 * */ public var speed:Number = 1.0; /** * 是否停止发布Tick事件 * * Tick事件的发布影响的内容非常多,一般情况不建议设置此属性,而是设置所有需要暂停物品的pause属性。 */ public var pause:Boolean = false; public function Tick() { displayObject = new Sprite(); displayObject.addEventListener(Event.ENTER_FRAME,enterFrameHandler); } /** * 清除掉积累的时间(在暂停之后) * */ public function clear():void { this.prevTime = 0; } private function enterFrameHandler(event:Event):void { var nextTime:int = getTimer(); if (!pause) { var interval:int; if (prevTime == 0) interval = 0; else { interval = Math.min(nextTime - prevTime,MAX_INTERVAL); var e:TickEvent = new TickEvent(TickEvent.TICK); e.interval = interval * speed; dispatchEvent(e); } } prevTime = nextTime; } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值