libGDXでプールを使用する方法と理由は? いくつかの例で使用されていることを除いて、このクラスに関する公式の開発ガイドには何もありません。
1 に答える
Poolクラスは、ガベージ コレクションのオーバーヘッドを回避するための最適化です。欠点は、プール内のオブジェクトを手動で管理する必要があり (再利用できるようにオブジェクトを解放することを忘れないでください)、オブジェクトを再利用可能にする必要がある (final
たとえば、通常はフィールドがない) ことです。
libGDX 内では、このPool
クラスは、別の方法では各フレームに割り当てられるオブジェクト (アクションやイベントなど) に使用されます。
大量のガベージが生成されるという問題が発生するまでは、独自のコードのプールを無視できます。
プールの利用方法
Pool<>
は単一タイプのオブジェクトを管理するため、そのタイプによってパラメーター化されます。オブジェクトはPool
、 を呼び出すことによって特定のインスタンスから取得されobtain
、次に を呼び出すことによってプールに返される必要がありますfree
。プール内のオブジェクトは、必要に応じてPool.Poolable
インターフェイスを実装できます (reset()
メソッドが存在することだけが必要です)。その場合、Pool
はオブジェクトがプールに返されるときに自動的にリセットします。オブジェクトは最初にオンデマンドで割り当てられます (したがって、 を呼び出さない場合obtain
、プールにはオブジェクトが含まれません)。
メソッドは抽象的であるPool<>
ため、独自のサブクラスを実装する必要があります。newObject
プールに関する注意事項
プールされたオブジェクトへの参照の漏洩に注意してください。プールで「free」を呼び出したからといって、未解決の参照が無効になるわけではありません。注意しないと、微妙なバグにつながる可能性があります。オブジェクトがプールに置かれたときにオブジェクトの状態が完全にリセットされていない場合、微妙なバグを作成することもできます。