Filterをどこにかけるかで重くなるのかのテスト

by mmlemon_
どこにフィルターを設定するかで実行速度が変わるのか調べたくて作りました。
MacBook proでは個別のBitmapにフィルターをかけた方が速かったです。
これは再描画領域が小さいから?

キー操作でフィルターを切り替えることができます。
上:コンテナ、Bitmapの粒全てフィルターon
下:コンテナ、Bitmapの粒全てのフィルターoff
左:コンテナoff、Bitmapの粒全てon
右:コンテナon、Bitmapの粒全てoff
♥0 | Line 116 | Modified 2010-03-27 19:29:16 | MIT License
play

ActionScript3 source code

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

package {
	/**
	 * どこにフィルターを設定するかで実行速度が変わるのか調べたくて作りました。
	 * MacBook proでは個別のBitmapにフィルターをかけた方が速かったです。
	 * これは再描画領域が小さいから?
	 * 
	 * キー操作でフィルターを切り替えることができます。
	 * 上:コンテナ、Bitmapの粒全てフィルターon
	 * 下:コンテナ、Bitmapの粒全てのフィルターoff
	 * 左:コンテナoff、Bitmapの粒全てon
	 * 右:コンテナon、Bitmapの粒全てoff
	 */
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.PixelSnapping;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.filters.GlowFilter;
    import flash.ui.Keyboard;
    import net.hires.debug.Stats;
     
    [SWF(backgroundColor=0x0,frameRate=60,width=465,height=465)]
	public class Main extends Sprite
	{
		private static const PARTICLE_NUM:int = 1500;
		
		private var m_sp:Sprite;
		private var m_glow:GlowFilter;
		
		public function Main()
		{
			addEventListener(Event.ADDED_TO_STAGE, init, false, 0, false);
		}
		
		private function init(event:Event):void
		{
			removeEventListener(Event.ADDED_TO_STAGE, init, false);
			
			initContainer();
			initFilters();
			initParticles();
			
			addChild(new Stats());
			addEventListener(Event.ENTER_FRAME, onRender, false, 0, false);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, stageKeyDownHandler, false, 0, false);
		}
		
		//------------------------------------
		// フィルターの切り替え
		//------------------------------------
		/**
		 * 一粒ずつに対するフィルター設定を切り替える
		 */
		private function changeBmpFilter(_useFilter:Boolean):void
		{
			for(var i:uint = 0; i < PARTICLE_NUM; i++)
			{
				var bmp:Bitmap = m_sp.getChildAt(i) as Bitmap;
				if(bmp!=null)
				{
					if(_useFilter)
					{
						bmp.filters = [m_glow];
					}
					else
					{
						bmp.filters = null;
					}
				}
			}
		}
		
		/**
		 * 粒全体を内包するコンテナへのフィルターを切り替える
		 */
		private function changeContainerFilter(_useFilter:Boolean):void
		{
			if(_useFilter)
			{
				m_sp.filters = [m_glow];
			}
			else
			{
				m_sp.filters = null;
			}
		}
		
		//------------------------------------
		// 動作チェック用イベントハンドラ
		//------------------------------------
		private function onRender(event:Event):void
		{
			// とりあえず動かしてみる
			m_sp.rotationY++;
			m_sp.rotationX-=0.5;
		}
		
		private function stageKeyDownHandler(event:KeyboardEvent):void
		{
			switch(event.keyCode)
			{
				case Keyboard.UP:
					changeBmpFilter(true);
					changeContainerFilter(true);
					break;
				case Keyboard.DOWN:
					changeBmpFilter(false);
					changeContainerFilter(false);
					break;
				case Keyboard.LEFT:
					changeBmpFilter(true);
					changeContainerFilter(false);
					break;
				case Keyboard.RIGHT:
					changeBmpFilter(false);
					changeContainerFilter(true);
					break;
				
				default:
					break;
			}
		}
		
		//------------------------------------
		// 初期化関連
		//------------------------------------
		private function initContainer():void
		{
			m_sp = new Sprite();
			m_sp.x = stage.stageWidth/2;
			m_sp.y = stage.stageHeight/2;
			addChild(m_sp);
		}
		
		private function initFilters():void
		{
			m_glow = new GlowFilter(0xffffff, 1, 12, 12, 4, 1, false, false);
		}
		
		private function initParticles():void
		{
			for(var i:uint = 0; i < PARTICLE_NUM; i++)
			{
				var col:uint = (0x33*Math.random()+0xcc) << 24 | 0xff*Math.random() << 16 | 0xff*Math.random() << 8 | 0xff*Math.random();
				var bmpd:BitmapData = new BitmapData(1, 1, true, col);
				var bmp:Bitmap = new Bitmap(bmpd);
				bmp.pixelSnapping = PixelSnapping.ALWAYS;
				addChild(bmp);
				
				bmp.x = Math.random() * stage.stageWidth - stage.stageWidth/2;
				bmp.y = Math.random() * stage.stageHeight - stage.stageHeight/2;
				bmp.z = Math.random() * 1000 - 500;
				m_sp.addChild(bmp);
			}
		}
	}
}