mxmlベースで制作した場合の再描画タイミング実験

by tail_y
FPSは0.3
マウスイベントは一切取ってないけど、クリックすると再描画されている。
flexベースでASを使用してプロジェクト組んでると、
遷移時に画面がチラつくなどの表示バグの原因になる。
実行速度低下の原因にもなるかも。

♥6 | Line 65 | Modified 2010-10-22 10:32:27 | MIT License
play

ActionScript3 source code

/**
 * Copyright tail_y ( http://wonderfl.net/user/tail_y )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/3asK
 */

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	horizontalAlign="left" 
	addedToStage="first();">
	<mx:Script>
		<![CDATA[
/**
 * FPSは0.3
 * マウスイベントは一切取ってないけど、クリックすると再描画されている。
 * flexベースでASを使用してプロジェクト組んでると、
 * 遷移時に画面がチラつくなどの表示バグの原因になる。
 * 実行速度低下の原因にもなるかも。
 */
			import mx.core.UIComponent;
			import flash.text.TextField;
			import flash.events.TimerEvent;
			import flash.utils.Timer;
			import flash.display.Sprite;
			import flash.events.Event;
			
			private var _view:UIComponent;
			
			private var _timer:Timer;
			private var _timerCount:Number = 0;
			private var _frameCount:Number = 0;
			private var _tf:TextField;
			
			private var _frameCircle:Sprite;
			private var _timerCircle:Sprite;
			
			private static const FPS:Number = 0.3;
			private static const TPS:Number = 10;
			
			public function first():void{
				_view = new UIComponent();
				addChild(_view);
				
				stage.frameRate = FPS;
				
				_tf = new TextField();
				_tf.width = 200;
				_view.addChild(_tf);
				
				_frameCircle = createCircle(0, 200, 0xff8855);
				_timerCircle = createCircle(0, 300, 0x88ff55);
				_view.addChild(_frameCircle);
				_view.addChild(_timerCircle);
				
				addEventListener(Event.ENTER_FRAME, frame);
				_timer = new Timer(1000 / TPS);
				_timer.addEventListener(TimerEvent.TIMER, timer);
				_timer.start();
			}
			private function timer(event:TimerEvent) : void {
				_timerCount++;
				_timerCircle.x = (_timerCircle.x + 5) % 400;
				draw();
			}
			private function frame(event:Event) : void {
				_frameCount = _timerCount;
				_frameCircle.x = _timerCircle.x;
				draw();
			}
			private function draw():void {
				var str:String = "";
				str += "クリックすると、\n画面が再描画されている?" + "\n";
				str += "frameCount=" + _frameCount + "\n";
				str += "timerCount=" + _timerCount + "\n";
				_tf.text = str;
			}
			
			
			private function createCircle(x:Number, y:Number, color:uint) : Sprite {
				var ans:Sprite = new Sprite();
				ans.graphics.beginFill(color);
				ans.graphics.drawCircle(0, 0, 20);
				ans.x = x;
				ans.y = y;
				return ans;
			}
		]]>
	</mx:Script>
</mx:Application>

Forked