Estoy tratando de dibujar un montón de líneas en Android usando OpenGL ES 2.0 y necesito saber la mejor manera de hacerlo.Vértices dinámicos rápidos en OpenGL ES 2.0 en Android
Ahora hice una clase llamada LineEngine que crea un FloatBuffer de todos los vértices para dibujar y luego dibuja todas las líneas a la vez. El problema es que aparentemente FloatBuffer.put() es muy lento y está consumiendo tiempo de CPU como loco.
Aquí es mi clase
public class LineEngine {
private static final float[] IDENTIY = new float[16];
private FloatBuffer mLinePoints;
private FloatBuffer mLineColors;
private int mCount;
public LineEngine(int maxLines) {
Matrix.setIdentityM(IDENTIY, 0);
ByteBuffer byteBuf = ByteBuffer.allocateDirect(maxLines * 2 * 4 * 4);
byteBuf.order(ByteOrder.nativeOrder());
mLinePoints = byteBuf.asFloatBuffer();
byteBuf = ByteBuffer.allocateDirect(maxLines * 2 * 4 * 4);
byteBuf.order(ByteOrder.nativeOrder());
mLineColors = byteBuf.asFloatBuffer();
reset();
}
public void addLine(float[] position, float[] color){
mLinePoints.put(position, 0, 8); //These lines
mLineColors.put(color, 0, 4); // are taking
mLineColors.put(color, 0, 4); // the longest!
mCount++;
}
public void reset(){
mLinePoints.position(0);
mLineColors.position(0);
mCount = 0;
}
public void draw(){
mLinePoints.position(0);
mLineColors.position(0);
GraphicsEngine.setMMatrix(IDENTIY);
GraphicsEngine.setColors(mLineColors);
GraphicsEngine.setVertices4d(mLinePoints);
GraphicsEngine.disableTexture();
GLES20.glDrawArrays(GLES20.GL_LINES, 0, mCount * 2);
GraphicsEngine.disableColors();
reset();
}
}
¿Hay una mejor manera de lotes todas estas líneas juntas?
¿Qué versión de Android es el dispositivo ejecutándose? Ha habido [problemas con FloatBuffer] (http://www.badlogicgames.com/wordpress/?p=899). GLES20 exige API nivel 8, por lo que es al menos Froyo. ¿Puedes probar en un dispositivo que ejecute Honeycomb? –
Lo estoy ejecutando en ICS en mi Galaxy Nexus. Comprobaré que en realidad lleva mucho tiempo. – EmbMicro
Acabo de probar el procesamiento por lotes de las líneas y no el procesamiento por lotes en mi Galaxy Nexus y EVO 4G. El EVO aumentó el FPS de 28.8 a 30 y el Galaxy Nexus se mantuvo igual en 58.4. Sin embargo, en el perfilador de métodos muestra que la función de dibujo (que incluye FloatBuffer.put y la llamada real de OpenGL) tomó mucho más tiempo. Pasó del 31.5% al 53.1% del tiempo de CPU. ¿Es esto solo el perfilador jugando con cosas? – EmbMicro