Обхідний маневр за допомогою FloatBuffer – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

Причина цього зовсім не очевидна Наш SpriteBatcher поміщає масив змінних float в прямій ByteBuffer кожен кадр, коли ми викликаємо Vertices setVertices Метод зводиться до виклику FloatBufferput (f1oat), і саме він винен у погіршенні продуктивності У той час як настільна версія Java виконує метод Fl oatBuf fer, задіявши память великого обєму, версія Harmony викликає FloatBufferput для кожного елемента масиву І це дуже погано, тому що цей метод є JNI-методом, який призводить до великих витрат (як і методи OpenGL ES, які також представляють собою JNI-методи)

Є кілька рішень проблеми Наприклад, IntBufferput (int) цієї проблеми не схильний Ми можемо замінити FloatBuffer в нашому класі Vertices на IntBuf fer і змінити Verti ces setVerti ces так, щоб він спочатку переносив змінні float з float-масиву в тимчасовий int-масив і потім копіював вміст цього int-масиву в IntBuf fer Це рішення запропонував розробник ігор Райан МакНеллі, котрий також повідомив про баге в багтрекер Android При усуненні цього бага продуктивність на Нього збільшиться в пять разів і трохи менше на інших пристроях з Android

Я включив в клас Verti ces це зміна Для цього я змінив тип поля verti cies на IntBuf fer Я також додав новий член tmpBuffer, який є масивом чисел int Масив tmpBuffer инициализируется в конструкторі Vertices наступним чином:

Ми також можемо побачити IntBuf fer в конструкторі замість FloatBuffer з ByteBuffer:

А метод Verti ces set Verti cesО виглядає ось так:

Таким чином, все, що ми робимо, – переносимо вміст параметра вершин в tmpBuffer Статичний метод FloatfloatToRawIntBitsO заново інтерпретує конфігурацію бітів f1oat як i nt Нам потрібно тільки скопіювати вміст масиву i nt в IntBuf fer, раніше відомий нам як Fl oatBuf fer Збільшить це продуктивність Тепер при використанні Spri teBatcherTest на Hero, Droid і Nexus One ми отримуємо такі результати:

Так, я перевірив ще раз, це не помилка Кадрова частота на Нього тепер дійсно 60 кадрів в секунду Обхідний маневр розміром всього в пять рядків коду збільшує швидкодію на 50% Швидкодія Droid теж трохи зростає

ПРИМІТКА

Є ще й інший, більш швидкий спосіб обійти проблему Він стосується JNI-методу, який виробляє зміни в памяті власного коду Ви можете знайти його в Інтернеті в Android Game Development Wiki Я здебільшого використовую цей обхідний шлях замість чистого Java-способу Однак робота з JNI-методами трохи складніша, тому я описав тут спосіб вирішення за допомогою Java

Джерело: 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>

*

*