Невеликий ліричний відступ про буфері NIO (нового вводу-виводу) – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

Якщо бути абсолютно точним, нам необхідні прямі буфери NIO Це означає, що їх память знаходиться не в купі віртуальної машини, а в нативної купі Для створення прямого буфера NIO підійде наступний фрагмент коду: ByteBuffer buffer = ByteBuffегallocateDirect (NUMBER 0F BYTES): buffer order (ByteOrdernativeOrderO)

Тут виділяється ByteBuffer, який може містити NUMBEROFBYTES (загальна кількість байт) і перевіряє, чи відповідає порядок байт використовуваному в центральному процесорі Буфер NIO має три властивості: capacity – максимальна кількість елементів, яке може містити буфер position – поточне місце розташування, куди буде записаний наступний елемент або звідки він буде прочитаний 1imit – індекс останнього певного елемента плюс один

Фактично місткість буфера – це його розмір У разі ByteBuffer цей розмір вимірюється в байтах Властивості position і limit можна вважати визначальними сегмент усередині буфера, який починається з position і закінчується на limit (ісключающе)

Оскільки ми хочемо визначити наші вершини як числа з плаваючою точкою, добре б впоратися з цими байтами На щастя, ми можемо перетворити екземпляр класу ByteBuffer в екземпляр класу FloatBuffer, який дозволяє нам працювати з числами з плаваючою крапкою

У випадку з FloatBuffег властивості capacity, position і 1imit є числами з плаваючою крапкою Наш патерн використання даних буферів досить простий Він виглядає наступним чином:

Спочатку визначаємо наші дані в стандартному масиві Java з чисел з плаваючою крапкою Перед тим як вставити масив в буфер, вказуємо буферу очистити себе за допомогою методу clear О Фактично так не стираються ніякі дані, просто, position отримує значення 0, а 1imit стає рівним capacity Далі використовуємо метод FloatBuffer Put float array), щоб скопіювати вміст всього масиву в буфер, починаючи з поточної позиції в буфері Після копіювання ця позиція збільшиться на довжину масиву Далі викликаємо метод put, який додає додаткові дані до даних попереднього масиву, який ми скопіювали в буфер Останній виклик FloatBuffer f1ip просто міняє місцями capacity і 1imit

Щоб краще зрозуміти, як це працює, припустимо, що наш масив вершин має розмір в 5 чисел із плаваючою точкою і що capacity нашого FloatBuffer досить велика, щоб вмістити в себе ці 5 чисел Після виклику FloatBuffer put позиція буфера дорівнюватиме 5 (індекси від 0 до 4 зайняті 5 числами з плаваючою точкою з нашого масиву), 1imit раніше буде дорівнює місткості буфера Після виклику FloatBuffer fl ip властивості position буде задано значення 0, a limit буде встановлений в 5 Будь сторона, яка спробує прочитати дані з буфера, буде знати, що їй слід читати числа з плаваючою точкою з індексу 0-4 (включно) Про це необхідно знати і OpenGL ES Зверніть увагу, що OpenGL ES проте не враховує limit Зазвичай ми повідомляємо кількість елементів, яке необхідно прочитати, робимо це разом з передачею буфера На даному етапі не перевіряються помилки, так що будьте уважні

Іноді краще встановити position буфера вручну після того, як ми його заповнили Це можна зробити за допомогою наступного методу:

Це стане в нагоді нам пізніше, коли ми тимчасово встановимо властивості position заповненого буфера небудь значення, відмінне від нуля, для того щоб OpenGL ES почав зчитування даних буфера з конкретної адреси

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*