MemoryManagement
概要
ここではHaxeFlixelにおけるメモリ管理の方法をまとめています
Haxeのメモリ管理
Haxeは言語機能としてガベージコレクションを採用しているため、newしたメモリ領域を開放する必要はありません。(※C++では独自のガベージコレクションシステムを採用している)
HaxeFlixelのメモリ管理
HaxeFlixelで使用するオブジェクトは、通常はFlxState.add を行い描画対象に追加します。そしてこれは同時に FlxState のメモリ管理下に置くこととなります。これにより、登録したオブジェクトは別のStateへの遷移(FlxG.switchStateなど)の際にすべて破棄されるため、通常はメモリ管理を意識する必要がありません。
破棄が必要なケース
描画が不要になったオブジェクトを FlxState.remove するとFlxState管理下から除外されます。ですので、この場合は手動でメモリ破棄を行わないと、メモリリークが発生します。
var _txt:FlxText; function _something():Void { // 描画が不要になったので、FlxState から外す FlxG.state.remove(_txt); // 手動でメモリ破棄 (※これを忘れるとメモリリークする) _txt = FlxDestroyUtil.destroy(_txt); }
手動でメモリ破棄を行う場合
HaxeFlixelに関するクラスは基本的に IFlxDestroyable というインターフェースを継承しています。 IFlxDestroyable のコードを見るとわかるのですが、このインターフェースには destroy 関数が定義されているだけです。
package flixel.interfaces; /** * Mainly used for FlxDestroyUtil.destroy(). */ interface IFlxDestroyable { public function destroy():Void; }
つまり、HaxeFlixelが用意している Flx* クラスは基本的に、使い終わったら destroy 関数を呼び出すことで、メモリ上から解放されるようになります
FlxDestroyUtilの使い方
destroyの使い方
FlxDestroyUtil.destroy は null を返すので、確実にメモリから消すためには以下のように記述します
var _spr:FlxSprite; // 破棄 override function destroy():Void { _spr = FlxDestroyUtil.destroy(_spr); }
putの使い方
var _pt:FlxPoint; // 破棄 override function destroy():Void { _pt = FlxDestroyUtil.put(_pt); }