Filterをどこにかけるかで重くなるのかのテスト
どこにフィルターを設定するかで実行速度が変わるのか調べたくて作りました。
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
archived:2017-03-10 04:55:30
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);
}
}
}
}