Подтвердить что ты не робот

Почему FloatBuffer вместо float []?

Я использовал FloatBuffers в своем Android-коде некоторое время (скопировал его из некоторого учебника по opengles), но я не могу точно понять, что это за конструкция и зачем она нужна.

Например, этот код (или аналогичный), который я вижу во многих программах для многих людей и в андроидах:

float[] vertices = ...some array...

ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
vbb.order(ByteOrder.nativeOrder());    // use the device hardware 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

Это кажется ужасно подробным и беспорядочным для чего-то, что, насколько я могу судить, - всего лишь причудливая обертка вокруг массива поплавков.

Вопросы:

  • Какое оправдание для этого типа класса (ByteBuffer, FloatBuffer), в отличие от любого другого типа коллекции или простого массива поплавков?

  • Какова идея создания ByteBuffer перед преобразованием его в FloatBuffer?

4b9b3361

Ответ 1

Основная причина - производительность: ByteBuffers и другие классы NIO обеспечивают ускоренные операции при взаимодействии с собственным кодом (обычно, избегая необходимости копировать данные во временный буфер).

Это очень важно, если вы делаете много вызовов рендеринга OpenGL, например.

Причина создания ByteBuffer заключается в том, что вы хотите использовать вызов allocateDirect для создания прямого байтового буфера, который выигрывает от ускоренных операций. Затем вы создаете FloatBuffer из этого, который использует одну и ту же память. По какой-то причине у FloatBuffer нет метода allocateDirect, поэтому вам нужно пройти через ByteBuffer.

Ответ 2

Мы выполняем наше кодирование в Java на Android, но основная реализация OpenGL ES на самом деле написана на C. Прежде чем передавать наши данные в OpenGL, нам нужно преобразовать ее в форму, которую она будет понимать. Java и родная система могут не хранить свои байты в том же порядке, поэтому мы используем специальный набор классов буферов и создаем ByteBuffer, достаточно большой для хранения наших данных, и сообщаем ему хранить свои данные, используя собственный порядок байтов. Затем мы преобразуем его в FloatBuffer, чтобы мы могли использовать его для хранения данных с плавающей запятой. Наконец, мы копируем наш массив в буфер.