時間効率,TimerとEnterFrameはFP 10.1の後でテストして提案します


TimerかEnterFrameかの選択については、多くのAS 3開発者が議論してきた話題ですが、10.1が普及するにつれて、今回は10.1のTimerとEnterFrameについて詳細なテストを行い、彼らの選択と使用に参考にしました.
注意、flashplayer 10.1現在のウィンドウが非アクティブ状態でfpsから2 fpsを自動的に低減し、cpu消費を節約するために追加されました.これは、fpsによって駆動されるenterframeの効率と正確性に直接影響します.
テスト環境は主にウェブページの下のflashの実行効率を主とし、空輸と再演算に分けられ、同時に実行し、それぞれ実行する.
FPSは25(ほとんどのアプリケーションのデフォルト値)、すなわち40 ms間隔であり、パブリケーション統一選択は10.1でパブリッシュされる.
頻繁なtraceや頻繁な書き込みシーンtxtの影響を避けるために,結果の純潔を保証するために間欠的な出力結果を設定した.
これらの実験を書いて、TimerとEnterFrameの使用についていくつかの提案があります.
1,EnterFrameは一定で安定しており、Tweenなどのレンダリング画面を更新するのに適しています.しかし、非同期計算や処理には適していません.cpuのフレーム当たりの計算効率が40 ms以内であることを保証できれば、enterframeシーケンスに計算を置くことができ、25 fpsを安定させることができます.もちろん、レンダリング損失は含まれません.
2,Timerは100 msの倍数で安定しており,pcもmacも安定しており,非100の倍数の値は2つの大きな差のない値が交互に現れる.
3,EnterFrameは12,20,30 fpsとも25 fpsより安定しており,25 fpsでは大きな差のない2つの数値が交互に現れる.
4,EnterFrameは計算時にTimerより優れている.
5,Timerは非同期の長周期を用いてデータの状態を変えるのに適しており,短時間でデータを更新したり,画面をレンダリングしたりするのに適していない.
6,EnterFrameとTimerは同様に非アクティブ創口のfps自動低下の影響を受けた.
7、影響を受けるとframeRate==2と判断することができず、1つの遅延時間を用いて、ちょうど500 msの遅延(2 fps)を判断し、対応するenterframeで切り替え特殊処理を行い、2 fpsで元の正常なfpsのレンダリング結果を完成させなければレンダリングの遅延の影響を避けることができない.
? [Copy to clipboard]
View Code ACTIONSCRIPT3
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() + "
"
; 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 = []; }   } }