¿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:
- Google google maps agrega al marcador propia etiqueta
- Propósito de los parámetros de varianza de AsyncTask
- Crear varias tablas para una clase en ORMLite
- WakefulBroadcastReceiver no se puede resolver con un tipo
- Java.lang.ClassCastException: android.os.ResultReceiver no se puede convertir en com.hello.utils.network.MyReciever
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?
- Actividad que se crea dos veces en android
- Explicar la notación Java "nuevo" con código entre corchetes
- ¿Por qué las cadenas de referencia de un archivo de recursos externos en lugar de codificación en la disposición de Android XML?
- RadioGroup extendiendo RelativeLayout?
- Problemas de memoria con frecuentes conversiones de Integer.toString ()
- Establecer el efecto de ondulación en la vista de imagen
- Android: Convertir secuencia a cadena sin quedarse sin memoria
- Multi-nivel ExpandableListView en Android
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.