¿Por qué FloatBuffer en lugar de float ?

He estado utilizando FloatBuffers en mi código de Android por un tiempo (copiado de algunos opengles tutorial), pero no puedo entender exactamente lo que es este constructo y por qué es necesario.

Por ejemplo, este código (o similar) que veo en muchos códigos de muchas personas y tutoriales para Android:

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 terriblemente detallado y desordenado para algo que por lo que puedo decir es sólo una envoltura de fantasía alrededor de una serie de flotadores.

Preguntas:

  • ¿Cuál es la justificación para este tipo de clase (ByteBuffer, FloatBuffer), en contraposición a cualquier otro tipo de colección o matriz simple de flotadores?

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

La razón principal es el rendimiento: ByteBuffers y las otras clases NIO permiten acelerar las operaciones al relacionarse con el código nativo (normalmente evitando la necesidad de copiar datos en un buffer temporal).

Esto es muy importante si usted está haciendo un montón de llamadas de renderizado OpenGL por ejemplo.

La razón para crear un ByteBuffer primero es que desea utilizar la llamada allocateDirect para crear un búfer de bytes directos , que se beneficia de las operaciones aceleradas. A continuación, crear un FloatBuffer 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.

Hacemos nuestra codificación en Java en Android, pero la implementación subyacente de OpenGL ES se escribe realmente en C. Antes de pasar nuestros datos a OpenGL, tenemos que convertirlo en una forma que va a entender. Java y el sistema nativo pueden no almacenar sus bytes en el mismo orden, por lo que usamos un conjunto especial de clases de buffer y creamos un ByteBuffer lo suficientemente grande como para contener nuestros datos, y le decimos que almacene sus datos usando el orden de bytes nativo. A continuación, convertirlo en un FloatBuffer para que podamos utilizarlo para mantener los datos de punto flotante. Finalmente, copiamos nuestra matriz en el búfer.

  • Samsung Galaxy Nexus diseño / estructura estirable?
  • URLConnection getContentLength () devuelve un valor negativo
  • Depurar el proyecto de la biblioteca de Android con el código fuente de java
  • ¿Existe un filtro "tee" simple para los flujos de Java?
  • Deserializar un objeto JSON con múltiples elementos dentro de él
  • Añadir un margen a LinearLayout en Android
  • Ráfaga de captura de cámara de Android2 es demasiado lento
  • Libgdx y la aplicación android. Imagen como fondo
  • Excluir paquetes de proguard
  • Consulta de SQLiteDatabase de Android con Regex
  • Cómo saber cuando Fragmento se vuelve invisible
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.