Ich möchte einen Audio-Visualizer mit Android GLES20 machen. captured image that I want to makeandroid opengl GLES20: Wie zeichnet man viele Dreiecke mit jeder Modellmatrix? (mit guter Leistung))
die Position jedes Rechtecks ist (0, 0), (0, 1), (1, 1), (1, 0)
jedes Rechteck verschiedenen Modellmatrix aufweist. (Drehen, Verschieben, Skalieren)
Und jedes Rechteck zeichnen mit GLES20.glDrawArrays. Aber dieser Weg kostet zu viel Zeit. (Mit, dass das Verfahren 200 mal) (Natürlich, ich 60 FPS wollen.)
Wenn ich GLES20.glDrawArrays Methode gleichzeitig verwenden und ziehen alle Rechtecke (= Dreiecke) auf einmal, Leistung wird gut werden.
Wie kann ich mit der Methode GLES20.glDrawArrays Dreiecke gleichzeitig zeichnen? (Dreieck hat gleiche Position Puffer, verschiedene Modellmatrix)
private void draw(int[] bufferId, int color, float[] modelMatrix, int count) {
GLES20.glUseProgram(programHandle);
int uMVPMatrixHandle = GLES20.glGetUniformLocation(programHandle, "u_MVPMatrix");
int aPositionHandle = GLES20.glGetAttribLocation(programHandle, "a_Position");
int aColorHandle = GLES20.glGetAttribLocation(programHandle, "a_Color");
Matrix.multiplyMM(MVMatrix, 0, viewMatrix, 0, modelMatrix, 0);
Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, MVMatrix, 0);
GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0);
GLES20.glVertexAttrib4f(aColorHandle, Color.red(color)/255f, Color.green(color)/255f, Color.blue(color)/255f, Color.alpha(color)/255f);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufferId[0]);
GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glEnableVertexAttribArray(aPositionHandle);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, count);
}
diese Methode ein Rechteck mit Puffer, Farbe, Modellmatrix ziehen. (count = 4)
Zuerst würde ich die glUseProgram Zeile am Anfang dieser Zeichenmethode loswerden. Es ist unnötig, wenn jedes Rechteck das gleiche Programm verwendet (das sieht so aus) und ich bin kein Experte, aber das verlangsamt möglicherweise Ihren FPS (wenn auch nicht viel). Fügen Sie stattdessen in Ihrer onDrawFrame() -Methode die glUseProgram-Zeile ein, bevor Sie auf jedes Rechteck zeichnen. – brohan322
Zusätzlich sind diese Handles int uMVPMatrixHandle = GLES20.glGetUniformLocation (programHandle, "u_MVPMatrix"); int aPositionHandle = GLES20.glGetAttribLocation (programHandle, "a_Position"); int aColorHandle = GLES20.glGetAttribLocation (programHandle, "a_Color"); sind für jedes Rechteck gleich. Dies wird FPS vermutlich nicht so sehr verbessern, aber ich würde keine Zeit damit verschwenden, diese Griffe für JEDES Rechteck zu definieren. Platzieren Sie diese Zeilen stattdessen in der onSurfaceCreated() -Methode, und gewähren Sie ihnen Zugriff in der draw() -Methode der Rechtecke. – brohan322
Dies waren nur Vorschläge zur leichten Verbesserung der FPS, sie werden keine wesentliche Verbesserung der FPS zeigen, aber es könnte ein wenig helfen. Ich habe keine Ahnung, was dein aktueller FPS ist – brohan322