2012-05-22 33 views
38

He estado usando FloatBuffers en mi código de Android por un tiempo (lo he copiado de un tutorial de opengles), pero no puedo entender exactamente qué es esta construcción y por qué es necesaria.¿Por qué FloatBuffer en lugar de flotar []?

Por ejemplo el código (o similar) que veo en el código y tutoriales androide muchos de muchas personas:

float[] vertices = ...some array... 

ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
vbb.order(ByteOrder.nativeOrder()); // use the device hardware's native byte order 
FloatBuffer fb = vbb.asFloatBuffer(); // create a floating point buffer from the ByteBuffer 
fb.put(vertices); // add the coordinates to the FloatBuffer 
fb.position(0);  // set the buffer to read the first coordinate 

Esto parece muy prolijo y complicado para algo que en la medida que puedo decir es sólo una fantasía envoltura alrededor de una serie de flotadores.

Preguntas:

  • ¿Cuál es la justificación para este tipo de clase (ByteBuffer, FloatBuffer), a diferencia de cualquier otro tipo de cobro o sencilla serie de flotadores?

  • ¿Cuál es la idea detrás de crear un ByteBuffer antes de convertirlo en un FloatBuffer?

Respuesta

39

La razón principal es el rendimiento: ByteBuffers y las otras clases NIO habilitar las operaciones se aceleró, al conectarse a código nativo (por lo general, al evitar la necesidad de copiar datos en un buffer temporal).

Esto es muy importante si está realizando muchas llamadas de representación OpenGL, por ejemplo.

La razón para crear un ByteBuffer primero es que desea usar la llamada allocateDirect para crear un búfer de bytes directo, que se beneficia de las operaciones aceleradas. A continuación, crea un FloatBuffer a partir de este que comparte la misma memoria. El FloatBuffer no tiene un método allocateDirect por alguna razón, por lo que tiene que ir a través de ByteBuffer.

10

Hacemos nuestra codificación en Java en Android, pero la implementación subyacente de OpenGL ES está realmente escrita en C. Antes de pasar nuestros datos a OpenGL, tenemos que convertirlos en una forma que va a entender. Es posible que Java y el sistema nativo no almacenen sus bytes en el mismo orden, por lo que usamos un conjunto especial de clases de búfer y creamos un ByteBuffer lo suficientemente grande como para contener nuestros datos, y le indicamos que almacene sus datos usando el orden de bytes nativo. Luego lo convertimos en un FloatBuffer para que podamos usarlo para mantener datos de coma flotante. Finalmente, copiamos nuestra matriz en el buffer.

Cuestiones relacionadas