Я изучаю OpenGL ES для Android через этот сайт: http://www.learnopengles.com/android-lesson-one-getting-started/
Есть несколько вещей, которые я не понимаю...
Что именно делает этот код:
mTriangle1Vertices = ByteBuffer.allocateDirect(triangle1VerticesData.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
mTriangle2Vertices = ByteBuffer.allocateDirect(triangle2VerticesData.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
mTriangle3Vertices = ByteBuffer.allocateDirect(triangle3VerticesData.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
mTriangle1Vertices.put(triangle1VerticesData).position(0);
mTriangle2Vertices.put(triangle2VerticesData).position(0);
mTriangle3Vertices.put(triangle3VerticesData).position(0);
Что это за "буферные" вещи и всегда есть четыре байта для поплавка? Я не уверен, зачем нужен код выше. Автор объяснил это, но я не уверен, что он имеет в виду.
Благодарю!
Зачем нам вообще нужно это делать?
Если бы мы кодировали в C, нам бы не понадобился приведенный выше код - мы бы просто пропустили весь материал ByteBuffer.allocateDirect и передали указатель на наш массив, когда будем называть drawArrays или drawElements. Однако мы не можем этого сделать, потому что у Dalvik, виртуальной машины Java, работающей внутри Android, есть сборщик мусора, и он может перемещать данные вокруг нас. Это может даже сломать память, ошибочно думая, что нам это больше не нужно. Безопасный способ сделать это - использовать ByteBuffer.allocateDirect для создания блока памяти в собственной памяти, скопировать данные на него, а затем OpenGL может использовать это напрямую, без необходимости беспокоиться о виртуальной машине.
Каждый буфер должен быть достаточно большим, чтобы хранить данные, которые мы собираемся скопировать; когда мы создаем буфер, он хочет иметь размер в байтах. Наш массив Java выполнен из поплавков, поэтому для определения размера в байтах мы передаем длину массива и умножаем его на 4. Значение с плавающей запятой - это 32-разрядное, а байт - 8-битное значение, поэтому всегда 4 байта для поплавка.
Надеюсь, это поможет. :)