时间效率,Timer 和 EnterFrame 在 FP 10.1 之后测试和建议

关于Timer还是EnterFrame的选择,一直是很多AS3开发者讨论的话题, 随着10.1即将普及,我这次对10.1的Timer和EnterFrame进行了一次较详细的测试,给大家在他们的选择和使用上做些参考。

注,flashplayer10.1新增了一个当前窗口在非激活状态下会自动降低fps到2fps来节省cpu消耗,这将直接影响靠fps驱动的enterframe的效率和准确性。

测试环境主要以网页下的flash执行效率为主, 分为空运算和重运算,同时运行和分别运行。

FPS为25(大多数应用的默认值), 即40ms间隔,发布统一选择以10.1发布。

为了避免因为频繁trace或频繁写入场景txt受到影响,我设定了间断式的输出结果来保证结果的纯洁。

写了这些实验,对Timer和EnterFrame的使用上有一些建议:

1,EnterFrame是恒定的,稳定的,比较适合用来更新渲染画面,如Tween。 但不适合做异步计算和处理, 如果能保证cpu每帧的计算效率在40ms以内,可以把计算放到enterframe时序中,这样可以稳定25fps,当然,这不包括渲染损耗。

2,Timer在100ms的倍数是很稳定的,pc和mac都能稳定,非100的倍数的值会有两个相差不大的值交替出现。

3,EnterFrame在12、20、30fps都比25fps更稳定,25fps会有两个相差不到大的数值交替出现。

4,EnterFrame在计算时优于Timer。

5,Timer更适合使用异步的长周期来改变数据的状态,并不适合短时间持续更新数据,或是渲染画面。

6,EnterFrame和Timer同样受到非活动创口的fps自动降低的影响。

7,当受到影响时,无法通过判断frameRate==2,使用一个延迟时间,判断出正好500ms的延迟(2fps),并在相应的enterframe中做切换特殊处理,在2fps中要完成原正常fps的渲染结果才能避免渲染的延迟影响。

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.text.TextField;
	import flash.utils.getTimer;
	import flash.utils.Timer;
 
	/**
	* ...
	* @author Demon.S
	*/
 
	public class Main extends Sprite
	{
		private var timerDelay:Number;
		private var enterDelay:Number;
		private var txt:TextField;
		private var log:String;
		public function Main():void
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			//init
			txt = new TextField();
			txt.width = 500;
			txt.height = 500;
			addChild(txt);
			log = "";
			//test suit
			//  testTimer();
			testEnterFrame();
		}
 
		private function testEnterFrame():void
		{
			stage.frameRate = 25;
			this.addEventListener(Event.ENTER_FRAME, enterFrameHandler)
			enterDelay = getTimer();
		}
 
		private function enterFrameHandler(e:Event):void
		{
			//heavyTest();
			var t:int = getTimer() - enterDelay;
			_trace("enter " +t )
 
			if (t == 500) _trace("fp10.1 hidden mode")
			enterDelay = getTimer();
		}
 
		private function timerUpdate(e:TimerEvent):void
		{
			// heavyTest();
			var t:int = getTimer() - timerDelay;
			_trace("timer " + t)
			if (t == 500) _trace("fp10.1 hidden mode")
			timerDelay = getTimer();
		}
 
		private function testTimer():void
		{
			var timer:Timer = new Timer(40);
			timer.addEventListener(TimerEvent.TIMER, timerUpdate)
			timerDelay = getTimer();
			timer.start();
		}
 
		private function _trace(...arguments):void
		{
			//trace.apply(this, arguments);
			log += arguments.join() + "\n";
			if (log.length > 100) {
				txt.appendText(log);
				txt.scrollV = txt.maxScrollV;
				log = "";
			}
		}
 
		private function heavyTest():void
		{
			for (var i:int = 0; i < 1000000 ; i++ ) var a:Array = [];
		}
 
	}
}

 

你可能感兴趣的:(活动,Flash,FP)