¿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.

  • Problemas con el joystick en pantalla de Android
  • ¿Hay un evento de instalación en android?
  • Los anuncios de AdMob no se muestran
  • ¿Cómo se muestra spinner si RxJava observable toma mucho tiempo?
  • Editext campo al utilizar la entrada de contraseña no ocultar contraseña
  • ¿Hay implicaciones de rendimiento al usar ArrayList.get () muchas veces por iteración?
  • onItemClick, Intent, errores de startActivity
  • Problema que coincide con el patrón regex en Android
  • Registrarse como reproductor de música y reproducir canciones
  • Catering para dispositivos que ejecutan frijol Jelly así como versiones posteriores a Jelly bean cuando se obtiene el uso de datos de la aplicación
  • AVD no dejará de cerrar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.