44 votes

Pourquoi FloatBuffer au lieu de float []?

J'ai été en utilisant FloatBuffers dans mon code Android pour un certain temps (copié à partir d'une opengles tutoriel), mais je ne comprends pas exactement ce que cette construction est et pourquoi elle est nécessaire.

Par exemple ce code (ou similaire), je vois dans beaucoup de beaucoup de peuples code et android tutoriels:

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

Cela semble terriblement bavard et ennuyeux pour quelque chose qui, autant que je peux dire c'est juste une fantaisie wrapper autour d'un tableau de float.

Questions:

  • Quelle est la justification de ce type de classe (ByteBuffer, FloatBuffer), par opposition à tout autre type de collection ou un tableau simple de flotteurs?

  • Quelle est l'idée derrière la création d'un ByteBuffer avant de le convertir en un FloatBuffer?

43voto

mikera Points 63056

La raison principale est la performance: ByteBuffers et les autres NIO classes permettant d'accélérer les opérations lors de l'interfaçage avec du code natif (généralement en évitant le besoin de copier des données dans une mémoire tampon temporaire).

C'est assez important si vous faites beaucoup de rendu OpenGL appels par exemple.

La raison de la création d'un ByteBuffer première, c'est que vous voulez utiliser la allocateDirect appel pour créer un direct octets de la mémoire tampon, qui bénéficie de l'accélération des opérations. Ensuite, vous créez un FloatBuffer à partir de ce qui partage la même mémoire. Le FloatBuffer n'est pas elle-même avoir un allocateDirect méthode pour quelque raison, qui est pourquoi vous devez passer par ByteBuffer.

14voto

John Points 450

Nous faisons de notre codage en Java sur Android, mais l'implémentation sous-jacente de l'OpenGL ES est écrit en C. Avant de nous passer de nos données à OpenGL, nous avons besoin de le convertir en une forme qu'il va comprendre. Java et le système natif peut pas stocker leurs octets dans le même ordre, donc, nous utilisons un ensemble spécial de tampon de classes et de créer un ByteBuffer assez grand pour contenir nos données, et dites-lui de stocker ses données en utilisant le natif d'ordre des octets. Nous avons ensuite le convertir en un FloatBuffer de sorte que nous pouvons l'utiliser pour tenir de données en virgule flottante. Enfin, on copie notre tableau dans la mémoire tampon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X