サイトのトップへ戻る

libGDX ドキュメント 日本語訳

サイト内検索

ModelCache

ModelBatchを使って大量のModelsを描写した時、 それがパフォーマンスに影響を与えることが分かるでしょう。 これは主に、モデルの全てのパーツ ごとに描写呼び出しが引き起こされるためです。 全ての描写呼び出しては GPUと CPU を同期させる必要があり、これは比較的負荷のかかる操作です。 したがって、通常は描写呼び出しの回数は最小限に抑えた方が良いでしょう。

描写呼び出しの回数を減らすにはいくつかの方法があります。 例えば、 視錐台カリングを使用したり(画面に写らないものは描写しない)、 モデルを最適化してパーツの数を少なくしたり、 モデルを結合して モデルの数を減らしたり、などです。 ModelCache (コード)では、最後二つの方法をプログラム実行中に行うことができます。

注意プログラム実行中にモデルの結合や最適化を行うのは、通常は比較的負荷のかかる操作で、誤って実行するとパフォーマンスが低下する可能性があります。 視錐台カリングやゲーム素材の最適化など、描写呼び出しを減らすための他の選択肢も常に実装するようにしてください。

ModelCache は、2D描写に使用されるSpriteCacheSpriteBatchとやや似ています。 ですが、models は通常sprites と比べてより複雑です。例えば頂点の数や頂点属性やマテリアルなどにおいて

ModelCacheはスキン処理がされたメッシュは結合しません。 スキン処理されたメッシュを追加した時それは結合されず、そのまま維持されます。 そのためスキン処理されたメッシュをキャッシュに追加しても安全ですが、それは描写呼び出しの回数を減らすことになりません(スキン処理は描写呼び出し内部で適用されるため)。



ModelCacheを使用する

ModelCache の使用は ModelBatchの使用と似ています。 モデルの結合と最適化を開始するには、begin() メソッドを呼び出す必要があります。 そして、1つ以上のModelInstanceもしくはRenderableProvideradd() します。 その後、end() メソッドを呼び出して実際の結合を実行します。

キャッシュが作成されると (end()を呼び出した後)、そのキャッシュはModelBatch.renderの呼び出しに使用できます。

ModelCache はいくつかのネイティブリソースを所有しています。したがって、不要になったらキャッシュを dispose() する必要があります。

ModelBatch batch;
ModelCache cache;
public void create() {
    //...
    Array<ModelInstance> instances = createTheInstanceYouWantToMerge();
    cache = new ModelCache();
    cache.begin();
    cache.add(instances);
    cache.end();
    //... create the batch and such
}
public void render() {
    //... call glClear and such
    batch.begin();
    batch.render(cache, environment);
    batch.end();
}
public void dispose() {
    // dispose models and such
    cache.dispose();
    batch.dispose();
}

例えば毎フレーム移動するオブジェクトのような、動的モデルにModelCacheを使用することができます。この場合、描写呼び出し毎でキャッシュを再作成できます。

ModelBatch batch;
ModelCache cache;
Array<ModelInstance> instances;
public void create() {
    //...
    instances = createTheInstanceYouWantToMerge();
    cache = new ModelCache();
    //... create the batch and such
}
public void render() {
    //... call glClear and such
    cache.begin();
    cache.add(instances);
    cache.end();

    batch.begin();
    batch.render(cache, environment);
    batch.end();
}
public void dispose() {
    // dispose models and such
    cache.dispose();
    batch.dispose();
}