J'ai un problème de performance dans mon jeu opengl 2.0. Le framerate était bon jusqu'à ce que je fasse un changement dans le jeu. C'est une sorte de jeu de l'épidémie avec 64 formes (briques). Ce que je veux maintenant, c'est que lorsque la balle frappe une brique, elle ne soit pas immédiatement enlevée - elle change de statut et cela inclut le changement de texture ou plus correctement - la coordonnée uv de l'atlas. J'ai un textureatlas et ce que je fais est juste d'appeler GLES20.bindBuffer() pour chaque texture dans la boucle, au lieu d'appeler l'extérieur de la boucle. Plus tôt j'ai eu le même uv-coord pour toutes les formes, mais maintenant, je le change en fonction de l'état de briques et c'est pourquoi je dois utiliser la liaison dans la boucleOpenGL ES 2.0: Perte de performance à l'aide de bindbuffer fréquemment
private void drawShape() {
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboDataListLevelSprites.get(iName).getBuff_id_vertices());
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, 0);
//used this snipped before when using the same image (uv-coords) for all bricks
/*GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboDataListLevelSprites.get(iName).getBuff_id_uvs());
GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);
GLES20.glVertexAttribPointer(mTextureCoordinateHandle, 2, GLES20.GL_FLOAT, false, 0, 0);
*/
for (Iterator<BrickProperties> it = arrayListBricks.iterator(); it.hasNext();) {
BrickProperties bp = it.next();
//now bindbuffer inside loop just too switch uv-coords of the atlas when its time to use another image
int buffIndexVal = bp.get_status_diff();
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, BrickProperties.get_buff_id_uvs()[buffIndexVal]);
GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);
GLES20.glVertexAttribPointer(mTextureCoordinateHandle, 2, GLES20.GL_FLOAT, false, 0, 0);
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, bp.getTranslateData()[0], bp.getTranslateData()[1], bp.getTranslateData()[2]);
if (bp.get_status() == 0) {
it.remove();
}
render();
}
}
private void render() {
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, mMVPMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);
}
Je comprends la raison de la baisse de performance est d'autant appels bindbuffer au GPU mais comment pourrais-je contourner ce problème?
Merci - Je vais regarder dans ce plus. Je pense que j'attrape le problème – java