2016-04-03 10 views
1

私はlibGDX(Androidおよびデスクトップ用)のマルチタイルベースのゲームのクライアントを作成しています。 ゲーム世界は、大きな矩形の表示領域に描画される数千の小さな32x32 png画像で構成されています。イメージは、必要に応じてソケット接続(ネットワーク)を介してダウンロードされます。libGDX:多くの小さな画像をlibGDXに保存して、素早く描画できます。

これらのイメージを「メモリ」に保存するための最速(最もリソース効率の良い)方法は何ですか?

これまでは、32x32の各画像をテクスチャにロードしてメモリに無期限に保存する非常に単純なアルゴリズムを実装しました。 (純粋な偶然の私のイメージは、2の累乗であるサイズを持っています。)動作しているようですが、これは非常に非効率で、古いデバイスや何かのGPUリソ​​ースを超える可能性があります。

私はTextureAtlasを認識していますが、コンパイルされたアンドロイドアプリにパックされて保存されている静的画像に対してのみ機能するようです。ネットワーク上でイメージを動的に受け取るので、これは私のためにはうまくいかないと思います。

多くの小さな画像をFrameBufferにレンダリングし、TextureRegionsのソースとしてこれを使用することを提案しているこの記事はlibgdx SpriteBatch render to textureです。これは私にとって有望なようです。これは良い解決策ですか? 良い方法がありますか?

私の小さな画像を描画して大きなPixmapに保存するのが参考になるのではないかと思います。上記のように、FrameBufferを描画するよりも、これはおそらく良いアプローチですか? 私がドキュメントから理解しているように、Pixmapは純粋にメモリベースです。それはおそらくグラフィックスリソースを必要としないため、テクスチャへの読み込みが高価な操作であるため、速度が遅くなる可能性があるため、利点になるかもしれません。これについての考え?

答えて

1

実際にはTextureAtlasが多くの画像を保存するのに最適な方法です(小規模でもなくてもかまいません)。そして、幸運にもTextureAtlasインスタンスは静的な方法で作成する必要はありません。

addRegion(java.lang.String name, Texture texture, int x, int y, int width, int height) 

TextureAtlas'es方法を見てみましょう。動的にアトラスを作成することができます。

だから、あなたが何をすべきか、その後(あなたがfindRegionまたは別の方法を使用してアトラスを使用することができ、その後

for(Texture texture : yourTexturesCollection) 
     atlas.addRegion(...); 

ループのいくつかの種類にあなたのイメージを追加する空のアトラス

TextureAtlas atlas = new TextureAtlas(); 

を作成することです参照を参照してください)


アンドロイドデバイス2048 x 2048pxより大きなアトラスを使用することをお勧めします。

dekstopのような別の種類のデバイスの場合、この値は別の(通常はより大きい)値にすることができます。 LibGDXの制限ではなく、OpenGLのものです!

+0

ありがとうございます。 FrameBuffersを使用するのは合理的にうまくいくように見えますが(すでにテスト済みです)、これは簡単な解決策のようです。 –

+0

TextureAtlasのソースコードを見て、何千もの小さなテクスチャを配列に格納すること以外何もしていないと思います。これは素敵なファサードの背後にある私の素朴な実装です:-)私はFrameBuffer実装を引き続き使用します。これは、Textureオブジェクトの量を大幅に減らすためです。 –

+0

実際にはそうではありません:) textureatlasを使用する理由は、1つの大きなテクスチャを使用することです。まずレンダリングするときに、GPUにグラフィックスを送信してパフォーマンスに影響を与えることです。 textureatlasでは、テクスチャを一度だけ送ります。 Google for SpriteBatchの 'render calls' –

関連する問題