primitiveは自前でキャッシュしたほうがいい
※ごめんこれプリミティブじゃなくてマテリアルじゃん、Planeとかと思ってちょ
BitmapFileMaterialは画像がキャッシュされている場合、コンストラクタ内でLOAD_COMPLETEをdispatchEventしてしまうので、インスタンス作成側からaddEventListenerしても時既に遅しとなる。
短絡的に考えると
var material : BitmapFileMaterial = new BitmapFileMaterial(url); if (material.loaded){ material.dispatchEvent(new FileLoadEvent(FileLoadEvent.LOAD_COMPLETE, url)); } else { material.addEventListener(FileLoadEvent.LOAD_COMPLETE, this.onMaterialLoadComplete); }
とかでいいのだけど、これそんなにスマートじゃない上に、一番致命的なのがメモリが超ふえまくる問題。特に該当する問題ではかなーり大きめなプリミティブだったので一瞬にしてFFが固まってしまうという罠。
AS3はガーベッジコレクションを備えているのだけど明示的なデストラクタがないという、なんという富豪プログラミングなキチガイ設計なのでできる限りインスタンスを新規作成することが望ましくない。
で、「あれキャッシュすりゃいいじゃん」という結論に落ち着いたんですけど。つい先日前に自分用に開発してるファイル管理ソフトで同じことをしてたので思いついてよかった。
/** * なんという適当な命名 */ public class CachedBFM extends BitmapFileMaterial{ public static var materialCache : array = []; public static createMaterial(url : string) : CachedBFM{ if (materialCache[url] == undefined){ materialCache[url] = new CachedBFM(url); } return materialCache[url]; } public CachedBFM(url : string){ super(url); } }
適当に書いたので動かんかもしらんけどこんな
しかしこれ、シングルトンっぽい挙動だからあんまり応用するところないかも