2017-10-05 159 views
1

我的遊戲背景渲染需要所有的渲染時間我一直在試圖改善它的1/4,但我仍然不認爲這是正常的,它需要這麼長知道如何簡單它是:的OpenGL/Libgdx:方格網渲染優化

的背景是一個正方形網格(如棋盤),其中每平方都有自己的顏色,從而改變每幀,正方形y位置變化,每幀過,但不x位置

這裏是我的主要渲染功能

public void main.render() { 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    final float deltaS = Gdx.graphics.getDeltaTime(); 

    background.update(deltaS); 
    updateTheGame(deltaS); 

    background.render(); 

    spriteBatch.setProjectionMatrix(uiCamera.combined); 
    spriteBatch.begin(); 
    renderTheGame(spriteBatch); 
    spriteBatch.end(); 

} 

這裏是背景的網聲明

mesh = new Mesh(true, nbVertices, nbIndices, 
       new VertexAttribute(VertexAttributes.Usage.Position, 2, ShaderProgram.POSITION_ATTRIBUTE), 
       new VertexAttribute(VertexAttributes.Usage.ColorUnpacked, 3, GL20.GL_FLOAT, false, ShaderProgram.COLOR_ATTRIBUTE)); 

這裏是後臺更新功能(稱爲每一幀渲染()之前) (這不是一個我想優化)

void background.update(float deltaS) { 
    for (BGSquareRow row : squareRows) 
     row.update(deltaS); 
    setupVerticesArray(); 
    mesh.updateVertices(0, verticesArray); 
} 


private final Color tmpColor = new Color(); 

private void setupVerticesArray() { 
    int index = 0; 
    for (BGSquareRow row : squareRows) { 
     final float y0 = row.y; 
     final float y1 = row.y + squareSize; 
     for (int i=0; i<nbSquareX; i++) { 
      row.getSquareColor(i, tmpColor); 
      final float x0 = squareXs[i]; 
      final float x1 = squareXs[i+1]; 
      verticesArray[index++] = x0; 
      verticesArray[index++] = y0; 
      verticesArray[index++] = tmpColor.r; 
      verticesArray[index++] = tmpColor.g; 
      verticesArray[index++] = tmpColor.b; 
      verticesArray[index++] = x1; 
      verticesArray[index++] = y0; 
      verticesArray[index++] = tmpColor.r; 
      verticesArray[index++] = tmpColor.g; 
      verticesArray[index++] = tmpColor.b; 
      verticesArray[index++] = x1; 
      verticesArray[index++] = y1; 
      verticesArray[index++] = tmpColor.r; 
      verticesArray[index++] = tmpColor.g; 
      verticesArray[index++] = tmpColor.b; 
      verticesArray[index++] = x0; 
      verticesArray[index++] = y1; 
      verticesArray[index++] = tmpColor.r; 
      verticesArray[index++] = tmpColor.g; 
      verticesArray[index++] = tmpColor.b; 
     } 
    } 
} 

這裏是),後臺生成功能,被稱爲background.update(後每幀(這是太costy之一)

void background.render() { 
     shaderProgram.begin(); 
     shaderProgram.setUniformMatrix("u_projTrans", parent.uiCamera.combined); 
     mesh.render(shaderProgram, GL20.GL_TRIANGLES); 
     shaderProgram.end(); 
} 

我試圖把僅有最少明白我的問題需要的,所以如果我忘了一些重要的東西,請告訴我

我有優化的一些想法,但我不知道如何做到這一點:

  • 有沒有可能來在主spriteBatch上繪製背景網格?這將導致在main.render()函數中1次繪製調用,而不是2次如果我是對的

  • 是否可以僅更新網格頂點緩衝區中的y,紅色,藍色和綠色值?我找到了更新頂點緩衝的一部分,但只有當它是一個連續部分

  • 是否有針對verticesArray設置任何可能的優化?

(我還試圖用ColorPacked爲頂點緩衝區,但它是不是更好)

+0

有多少行/列有哪些? – Tenfour04

+0

有10分格17行!它填補了屏幕 –

+0

而且你知道,如果你是填充速率限制或CPU有限的,還是什麼?這看起來真是小巫見大巫,所以如果你需要對其進行優化,可能會出現一些嚴重的問題,那就是在代碼中你沒有顯示。 – Tenfour04

回答

0

您可以創建使用meshParts,其中每個meshPart將代表一個方格您的網格。然後,您可以使用GLSL着色器爲每個不同顏色的方塊着色。這應該最大限度地減少您的CPU工作時間,並將利用GPU的功率

Here's an example of colorizing shader with libGDX.MeshPart render方法支持將ShaderProgram作爲參數傳遞,並且可以包含特定的材質。