2017-10-05 9 views
1

Le rendu en arrière-plan du jeu prend 1/4 de la durée de rendu que j'essaie de l'améliorer, mais je ne pense pas qu'il soit normal que cela dure si longtemps. il est:OpenGL/Libgdx: Optimisation du rendu de la grille carrée

l'arrière-plan est une grille carrée (comme un jeu d'échecs) où chaque carré a sa propre couleur, qui change chaque image, les carrés position y change chaque image trop, mais pas la position x

ici est ma fonction de rendu principale

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(); 

} 

Voici la déclaration de maillage de l'arrière-plan

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)); 

Voici la fonction de mise à jour d'arrière-plan (appelé toutes les images, avant de rendre()) (Ce n'est pas celui que je veux optimiser)

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; 
     } 
    } 
} 

ici est l'arrière-plan rendu fonction, appelée chaque trame après background.update() (C'est trop costy un)

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

J'ai essayé de mettre le minimum nécessaire pour comprendre mon problème, donc si j'oublié quelque chose d'important, s'il vous plaît me dire

J'ai quelques idées d'optimisation, mais je ne sais pas comment le faire: Serait-il possible

  • à dessiner le maillage de l'arrière-plan sur le spriteBatch principal? Cela entraînerait 1 appel draw dans la fonction main.render() au lieu de 2 si j'ai raison

  • Est-il possible de mettre à jour uniquement les valeurs y, rouge, bleu et vert dans le tampon vert de maillage? J'ai trouvé des moyens de mettre à jour une partie du tampon vertice, mais seulement s'il s'agit d'une partie continue

  • Y a-t-il une optimisation possible pour la configuration de verticesArray?

(j'ai essayé aussi d'utiliser ColorPacked pour le tampon de Vertice, mais il n'a pas été mieux)

+0

Combien de lignes/colonnes y a-t-il? – Tenfour04

+0

Il y a 17 rangées de 10 carrés! Il remplit l'écran –

+0

Et savez-vous si vous avez un taux de remplissage limité ou CPU limité, ou quoi? Cela semble vraiment trivial, donc si vous avez besoin de l'optimiser, il peut y avoir un problème sérieux qui est dans le code que vous n'avez pas montré. – Tenfour04

Répondre

0

Vous pouvez créer votre maillage avec l'aide meshParts, où chaque meshPart représentera simple carré de la grille. Ensuite, vous pouvez colorier chacun des carrés de couleur différente en utilisant un shader GLSL. Cela devrait minimiser le temps de travail de votre processeur et utiliser la puissance GPU.

Here's an example of colorizing shader with libGDX. méthode render MeshPartShaderProgram prend en charge le passage en tant que paramètre et peut contenir un matériau spécifique.