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