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