2014-01-16 11 views
5

3Dスクラブルのようなゲームでは、わずか8FPSしか得られないというパフォーマンス上の問題があります。それを文字のタイルに絞った。そのうちの100があり、その数を減らすとパフォーマンスが急速に向上します。すべてのタイルがスクリーンショットのように同じテクスチャを持っていても、速度は向上しないので、テクスチャバインドを排除しました。libgdxの片面にテクスチャを持つボックスを構築する - パフォーマンス

​​

これは、私は各ボックスを作成する方法である:

public static void createModel() { 
    matWhite = new Material(ColorAttribute.createDiffuse(Color.WHITE)); 
    ModelBuilder modelBuilder = new ModelBuilder(); 
    modelBuilder.begin(); 
    MeshPartBuilder tileBuilder; 
    tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matWhite); 
    tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); 
    tileBuilder = modelBuilder.part("bottom", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
    tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f,  0.45f, 0f, 0.45f,  -0.45f, 0f, 0.45f, 0f, -1f, 0f); 
    tileBuilder = modelBuilder.part("front", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
    tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0f, 0.45f,  0.45f, 0f, 0.45f,  0.45f, 0.1f, 0.45f, 0f, 0f, 1f); 
    tileBuilder = modelBuilder.part("left", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
    tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0.1f, -0.45f, -0.45f, 0f, -0.45f, -0.45f, 0f, 0.45f, -1f, 0f, 0f); 
    tileBuilder = modelBuilder.part("right", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
    tileBuilder.rect(0.45f, 0.1f, 0.45f, 0.45f, 0f, 0.45f,  0.45f, 0f, -0.45f,  0.45f, 0.1f, -0.45f, 0f, 0f, 1f); 
    tileBuilder = modelBuilder.part("back", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
    tileBuilder.rect(-0.45f, 0.1f, -0.45f, 0.45f, 0.1f, -0.45f, 0.45f, 0f, -0.45f, -0.45f, 0f, -0.45f, 0f, 0f, 1f); 
    modelTile = modelBuilder.end(); 
} 

public void createModelInstance(com.badlogic.gdx.assets.AssetManager assetManager) { 
    Texture texTile = assetManager.get("textures/" + textureFile + ".jpg", Texture.class); 
    Material mat = new Material(TextureAttribute.createDiffuse(texTile)); 
    modelInstance = new ModelInstance(modelTile); 
    modelInstance.nodes.get(0).parts.get(0).material.set(mat); 
} 

実験している間、私はメッシュを交換する場合はその速度が(でも使用されているすべての100枚のテクスチャで)最大25 FPSを行くましたシンプルなボックス(すべての面にテクスチャを表示するので、このゲームではあまり役に立ちません)を作成して、部分ビルドコードを作成します。それらのcreateBoxメソッドもrect()を6回呼び出しますが、これまでのところ違いを見ることはできません。

modelTile = modelBuilder.createBox(0.9f, 0.1f, 0.9f, matWhite, Usage.Position | Usage.Normal | Usage.TextureCoordinates); 

最初のコードで何が間違っていますか?片面のみにテクスチャを持つボックスを作成する正しい方法は何でしょうか?

+0

デスクトップまたはAndroid/iOSに導入していますか?デスクトップにデプロイする場合は、専用のGPUが使用されていることを確認してください。私は現在、Ubuntu上で(矩形ではなく、線を使用して)何か似たようなものを実行しています。私はそれが私のNvidiaカードではなく、アプリケーションを実行している私のインテルカードだと信じているので、かなりの性能を邪魔しています。しかし、まだそれの底には達していない。 –

+0

私が書いたFPS値は三星銀河タブ2 10.1ですが、エミュレータの値も近いです(Use Host GPUオプションがチェックされています)。 – Arthur

答えて

5

modelBuilder.partに電話するたびに、ドローコールが行われます。彼らはかなり高価なので、実際に描画呼び出しの数を最小限に抑えたいと思っています。さらに、異なる頂点属性を持つため、最初と他の部分の間でメッシュとシェーダを切り替える必要があります。また、メッシュスイッチとシェーダスイッチの数を最小限に抑えたい場合もあります。

だから、あなたはおそらく同じ属性を持つパーツを組み合わせたいでしょう最適化を開始する:

tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matWhite); 
tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); 
tileBuilder = modelBuilder.part("others", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal, matWhite); 
tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f,  0.45f, 0f, 0.45f,  -0.45f, 0f, 0.45f, 0f, -1f, 0f); 
tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0f, 0.45f,  0.45f, 0f, 0.45f,  0.45f, 0.1f, 0.45f, 0f, 0f, 1f); 
tileBuilder.rect(-0.45f, 0.1f, 0.45f, -0.45f, 0.1f, -0.45f, -0.45f, 0f, -0.45f, -0.45f, 0f, 0.45f, -1f, 0f, 0f); 
tileBuilder.rect(0.45f, 0.1f, 0.45f, 0.45f, 0f, 0.45f,  0.45f, 0f, -0.45f,  0.45f, 0.1f, -0.45f, 0f, 0f, 1f); 
tileBuilder.rect(-0.45f, 0.1f, -0.45f, 0.45f, 0.1f, -0.45f, 0.45f, 0f, -0.45f, -0.45f, 0f, -0.45f, 0f, 0f, 1f); 

し、さらに最適化するために、(すべてのメッシュのスイッチを排除する)、あなたは同じ頂点属性を使用することができます。もちろんこれは、テクスチャ属性をテクスチャなしで側面に追加します。しかし、材料がテクスチャを持たない限り、それらは無視されます。

tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matTop); 
tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); 
tileBuilder = modelBuilder.part("others", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matOthers); 
tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f,  0.45f, 0f, 0.45f,  -0.45f, 0f, 0.45f, 0f, -1f, 0f); 
... 

(すべてのシェーダスイッチを排除し、ドローコールの数を減少させる)もさらに最適化するには、辺によって使用されるテクスチャを単一の画素を追加して、UV範囲accordingleを設定することができる。

tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, matWhite); 
tileBuilder.setUVRange(0,0,1,1); 
tileBuilder.rect(-0.45f, 0.1f, 0.45f, 0.45f, 0.1f, 0.45f, 0.45f, 0.1f, -0.45f, -0.45f, 0.1f, -0.45f, 0f, 1f, 0f); 
tileBuilder.setUVRange(0,0,0,0); // Assumes the top left pixel is the correct color for the other sides 
tileBuilder.rect(-0.45f, 0f, -0.45f, 0.45f, 0f, -0.45f,  0.45f, 0f, 0.45f,  -0.45f, 0f, 0.45f, 0f, -1f, 0f); 
... 

ここでもパフォーマンスの問題が発生した場合、複数のタイルを1つのモデルに結合することを検討できます(一部は描画呼び出し)。しかし、それはおそらく上記の変更ですぐに必要ではないでしょう。

詳細情報:http://blog.xoppa.com/behind-the-3d-scenes-part1/

+0

FPS、よろしく!今あなたのブログのエントリを読んで、おかげでたくさん! – Arthur

関連する問題