2014-01-16 17 views
5

在3D拼圖遊戲中,我的性能問題只有8個FPS。將其縮小爲字母瓦片。有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); 
} 

雖然實驗,我發現這樣的速度上升到25 FPS(即使正在使用的所有100個紋理),如果我更換網部分建築代碼與創建一個簡單的盒子(它顯示了各方面的紋理,所以它不是非常有用的這個遊戲)。他們的createBox方法也調用了rect()6次,但到目前爲止我沒有看到區別。

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

我在做第一個代碼時出錯了嗎?只有一面創建具有紋理的框的正確方法是什麼?

+0

您是在桌面上還是在Android/iOS上部署?如果您要在桌面上部署,請確保正在使用專用GPU。我目前在Ubuntu上運行類似的東西(使用行,而不是rects),並且我得到了大約1000行的類似問題。我相信這是我的英特爾卡運行的應用程序,而不是我的Nvidia卡,因此阻礙了性能相當多。儘管如此,還沒有到底。 –

+0

我寫的FPS值在三星Galaxy Tab 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); 
... 

現在,如果您仍然遇到性能問題,可以考慮將多個貼圖合併到一個模型中(部分:繪製調用)。但是,上述變化可能不會立即需要。

更多信息:http://blog.xoppa.com/behind-the-3d-scenes-part1/

+0

25 FPS,耶!現在閱讀您的博客條目,非常感謝! – Arthur