Чому OpenGL ES-рендерінг такий повільний? – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

Те, що НТС Нього повільніше, ніж пристрої другого покоління, не секрет Проте чіп PowerVR в Droid трохи швидше, ніж чіп Adreno в Nexus One, так що попередні результати на перший погляд досить дивні При подальшому дослідженні ми можемо, напевно, пояснити різницю не різною потужністю графічного процесора, а тим, що викликаємо безліч методів OpenGL ES в кожному фреймі і ці методи займають дуже багато памяті Це означає, що вони фактично викликають С-код, який вимагає більше памяті, ніж виклик методу Java на Dalvik У Nexus One є динамічний компілятор, так що він має деякий простір для оптимізації Тому давайте будемо вважати, що різниця обумовлена ​​динамічним компілятором, (що, можливо, не зовсім правильно)

А тепер подивимося, що в OpenGL ES залишає бажати кращого: безліч змін станів в кожному кадрі (наприклад, змішування, включення / вимикання нанесення текстури і т д) велика кількість змін матриць в кожному кадрі безліч операцій привязування текстур в кожному кадрі багаторазові зміни вершин, кольору і координат текстури в кожному кадрі

Всі ці проблеми фактично повязані зі змінами станів Чому вони вимагають так багато памяті Графічний процесор працює як складальна лінія на фабриці Поки перша лінія обробляє які товари, кінцева лінія закінчує вже оброблені на всіх попередніх стадіях продукти Спробуємо провести паралель з автомобільним конвеєром

Продукція на виробничій лінії проходить через кілька станів Спочатку застосовуються інструменти, з якими працюють фахівці заводу, потім кріплення, використовувані для зєднання частин машини, потім в хід йде фарба, якою покривають машини, і т д Звичайно, справжні автомобільні заводи мають у своєму розпорядженні безліч ліній, але давайте припустимо, що лінія всього одна У такому випадку кожна стадія лінії буде зайнята до тих пір, поки ми не змінимо стан Коли ми змінюємо один етап, лінія буде продовжувати працювати, поки всі збираються машини не будуть закінчені Тільки після цього ми можемо перейти до іншого стану і збирати машини нового кольору або з новими кріпленнями

Ключовий момент полягає в тому, що виклик glDrawElements або glDrawArraysO не виконується відразу Замість цього команда міститься в буфер, який асинхронно обробляється графічним процесором Це означає, що виклик методів малювання не блокується Тому навряд чи варто вимірювати, скільки часу займе виклик gl DrawEl ements, оскільки сама робота може бути виконана у майбутньому

Саме тому ми все вимірюємо в кадрах в секунду Коли фреймбуфер міняються місцями (так, і в OpenGL ES застосовується подвійна буферизація), OpenGL ES виконує всі відкладені операції

Знову порівняємо OpenGL ES з автомобілебудівним заводом У той час як нові трикутники надходять в командний буфер за допомогою виклику gl DrawEl ements або glDrawArrayst), конвеєр графічного процесора повинен закінчити візуалізацію поточних трикутників з попередніх викликів (наприклад, трикутник може перебувати на стадії растеризації) Цим обумовлені такі особливості

На заміну актуальною привязаною текстури йде багато памяті Будь-які ще не оброблені, але використовують текстуру трикутники в командному буфері повинні спочатку бути візуалізовані

Зміна вершин, кольору або текстурних координат також вимагає багато памяті Будь-які ще візуалізовані трикутники, розташовані в командному буфері і застосовують старі покажчики, повинні спочатку бути візуалізовані

Зміна стану змішування вимагає багато памяті Будь-які ще візуалізовані, але вимагають / не потребують змішування трикутники в командному буфері, до яких повинні бути застосовані старі матриці, повинні спочатку бути візуалізовані Про Нарешті, багато памяті потрібно на зміну моделі-виду або проекційної матриці Будь-які знаходяться в командному буфері трикутники, які поки не були оброблені і до яких повинні застосовуватися старі матриці, доведеться відображати в першу чергу Конвеєр застигне

Суть усього це проста – скоротіть зміни станів до мінімуму

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

*

*