¿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:
- BufferedReader mientras lee datos Json
- ¿Cuál es la diferencia entre commit () y commitAllowingStateLoss () en Fragments
- Uso de la actividad de la cámara en Android
- Bucle liso del juego del androide
- ¿Está bien bloquear el subproceso de la interfaz de usuario al mostrar un diálogo de alerta?
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?
- ¿Existe un patrón de registro de GCM?
- Telephony.Sms.Inbox.PERSON utiliza Contacts.People._ID obsoletos
- Programaticamente escribir en un dispositivo Android
- IllegalStateException en Android Support al ejecutar pruebas de unidad
- Actualización del componente UI de actividad de Broadcast Receiver?
- Tratando de devolver datos de PHP con JSON a Android ...
- HttpClient se detiene durante largos períodos de tiempo, incluso con parámetros de tiempo de espera establecidos
- Cómo averiguar qué clase anónima interior se indica por un nombre de clase?
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.