イナヅマTVログ

【見た聞いた】FITC Tokyo 2010, Mike Chambers 番外編 DisplayObject[‘constructor’] as Class

| 4件のコメント

2010-12-04 FITC Tokyo 2010 の Mike Chambers のセッション。
タイトルは「Flashで作成する高性能モバイルコンテンツ」- “Creating high Performance mobile content with ActionScript 3 and Flash CS5″。

遅いCPUしかのっていないモバイルデバイス(Android)で快適に動作するFlashコンテンツ制作のための最適化ノウハウを話していました。
Mike Chambers のセッションの内容は野中先生が次の日に記事にしてくれてますのでそちらをご覧になって下さい。
F-Site : [AS3] パフォーマンス向上のヒント
http://f-site.org/articles/2010/12/05190305.html
記事からも引用されている、FITC Amsterdam 2010のPDF

Mikeが一言も触れていないコードのはなし

DisplayObject[‘constructor’] as Class
Mike はソースを見せながら色々デモをしていました。
当然内容は最適化の話なので、今旬のGPUモードでのレンダリング・パフォーマンスについてかなりの時間を割いて説明していました。

表示されたソースの中で話とは全然関係ないところに興味を引きつけられました。
本筋とは関係ないところなので何の説明も無く一瞬表示されただけでしたが。。。

DisplayObject['constructor'] as Class

この1行に目が引きつけられました。
無知なだけだったのですが DisplayObjectconstructor プロパティが存在することを知りませんでした。
いや、APIドキュメントで見たことはあったかもしれませんが気にもとめていませんでした。

API によればconstructor プロパティは最上位のObjectクラスに存在し継承する全てのクラスが持っていることになります。
CS5 Livedoc : Object.constructor
この説明はわかんない、て言うより読む気力がうせてしまう。

Mike のセッションでこのコード目にした時に、これでステージ上のパーツを複製できるのかも、と思いました。

ステージ上のパーツを複製
ステージにシンボル名”box01″のMovieClipがあります。
box01はBox01クラスへリンケージされています。

// frame script
import flash.events.MouseEvent;
import flash.display.DisplayObject;
 
box01.addEventListener(MouseEvent.CLICK, onClick);
function onClick (e:MouseEvent):void {
	makeClone(e.currentTarget as DisplayObject)
}
 
function makeClone (d:DisplayObject):void {
	var cloneClass:Class = d['constructor'] as Class;
	var cloned:DisplayObject = DisplayObject(new cloneClass());
 
	cloned.x = Math.random() * stage.stageWidth;
	cloned.y = Math.random() * stage.stageHeight;
	cloned.alpha = Math.random();
	addChild(cloned);
}

Box01.as

package  {
	import flash.display.MovieClip;
	import flash.events.Event;
 
	public class Box01 extends MovieClip {
 
 
		public function Box01() {
			if (stage) init(null);
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		protected function init (e:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			addEventListener(Event.EXIT_FRAME, onExitFrame);
		}
 
		protected function onExitFrame (e:Event):void {
			rotation += 5;
		}
	}
}

もともとステージに存在するbox01をクリックすると複製されたbox01がステージ上にランダムに配置されます。
今まで、このようなことが必要になることが無かったので調べたり使う機会もありませんでしたが…

インスタンスを複製をしたい時に使えそうです。

他人のコードは見ると勉強になると、あらためて思いました。
自分のコードを見せるのはちょっと恥ずかしい。

update
@ProjectNya さんから次の記事があることを教えてもらいました。

AS3でduplicateMovieClipできちゃう?
AS3でduplicateMovieClipはできない。

AS2の頃は可能だった duplicateMovieClip がAS3で廃止になったけどどうする?って記事の中で DisplayObject['constructor'] が使われていて複製できるけど、duplicateMovieClip とは微妙に違うよね、な話のようです。

update
スピーカーのMike Chambers(@mesh)からコメントをいただきました。
Object pool 関連の話の中で DisplayObject['constructor'] は使われていたようです。

Object pool は Flashコンテンツ最適化の最重要項目です。
インスタンスを使い回すことを目的とした考え方で、Flashパフォーマンスの話になると必ず登場します。
Object poolの話は今回はちょっとわきに置いとこう、これ私には荷が重すぎる。

Mike Chambersはgithubに様々なライブラリをホストしてます。
adobe名義のものもありますしそうでないものもあります。
ダウンロードして研究するときっと幸せがくるでしょう。

https://github.com/mikechambers/

update 2010-12-09
com.mikechambers.sgf.pools.ObjectPool

private var pools:Dictionary;
 
private function getPool(classType:Class):Array
{
	var pool:Array = pools[classType];
	if(!pool)
	{
		pool = new Array();
		pools[classType] = pool;
	}
 
	return pool;
}
 
public function returnGameObject(go:GameObject):void
{			
	//put this property in game object as a static prop
	var classType:Class = go["constructor"] as Class;
 
	var pool:Array = getPool(classType);
 
	var hasObject:Boolean = false;
 
	for each(var g:Object in pool)
	{
		if(g == go)
		{
			hasObject = true;
			break;
		}
	}
 
	if(!hasObject)
	{
		pool.push(go);
	}			
}

returnGameObject ココですね、使われていたのは。

//put this property in game object as a static prop
var classType:Class = go["constructor"] as Class;

ふむふむ、要研究かな。

4件のコメント

  1. Yeah, I use this in one of my Display Object pools, so I can have a single / generic pool that can pool multiple types (based on class):

    https://github.com/mikechambers/Simple-Game-Framework/blob/master/src/com/mikechambers/sgf/pools/CacheableDisplayObjectPool.as

    Thanks for posting the writeup. Had a great time in Tokyo and at FITC.

    mike chambers

    mesh@adobe.com

  2. Thank you, Mike.
    I will check to Simple-Game-Framework and CacheableDisplayObjectPool.as.

    I really enjoyed FITC Tokyo.

  3. ピンバック: Tweets that mention 【見た聞いた】FITC Tokyo 2010, Mike Chambers 番外編 DisplayObject['constructor'] as Class | イナヅマtvログ -- Topsy.com

  4. ピンバック: ActionScript 3.0, AS2ライクにDuplicateMovieclipをするために | イナヅマtvログ

コメントを残す

必須欄は * がついています


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください