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);
  }
}}