Поради щодо оптимізації OpenGL [закрито]


26

Які поради або підказки ви маєте зробити, коли зробити OpenGL більш ефективним?

Відповіді:


16

Використовуйте VBO, а не glStart () / glEnd (). Це економить цикли при передачі даних в пам'ять GPU.


7
Більше того, glBegin та glEnd були згорнуті в пізніших версіях та були повністю видалені (і тому не працюватимуть) у версіях 3.x та вище. Якщо ви запитаєте контекст OpenGL 3.x, ви не зможете їх повністю використовувати.
Slurps Mad Rips

DirectX насправді змушує це робити, він не має еквіваленту glStart()/glEnd().
knight666

@SAHChandler Я цього не знав. Я не розумів, що це застаріло.
Містер Вальдес

3
@SAHChandler: Це смокче! Я вивчив усі свої малюнки за допомогою glBegin () та glEnd (). Noooo !!!

8

Стандартний наконечник профілю, профілю, профілю застосовується так само добре, хоча інструменти дещо відрізняються.

gDEBugger чудово допомагає точно бачити, що відбувається під капотом. Хоча це дорого.


2
Просто хотів додати, що зараз він безкоштовний.
DMan

8

Це з посилань на документацію Apple на OpenGL, але кожен трішки допомагає? ;)

Оптимізація продуктивності OpenGL: основи
оптимізації пропускної здатності даних OpenGL в OS X

(Останнє є зразком програми)
Оптимізація вершин

Існує також дуже велика кількість відео на цю тему (Також від Apple), які розповідають про розширення OpenGL. Деякі з них є специфічними для ОС X, але деякі з них більш узагальнені і, швидше за все, можуть бути застосовані до Windows та Linux.

Відео ви можете знайти тут . Для їх перегляду потрібні iTunes та обліковий запис Apple (але вони безкоштовні!: D)


7

Ну, це дійсно, насправді залежить від того, що ви плануєте робити, але ось основні принципи:

  • Ваш процесор дуже дорогоцінний, тоді як ваш GPU - голодний звір. Змініть на графік якнайбільше. Сьогодні це можна зробити з чудовими бібліотеками, такими як OpenCL, CUDA та Thrust.

  • Робіть своє освітлення в шейдері. Це не тільки допоможе зберегти вашу розумність, але дозволяє вам дуже круті речі, такі як тонові шейдери та відкладене освітлення .

  • Частинки смокчуть. Навіть при використанні точок спрайту OpenGL.


6

Мінімізуйте зміни у своєму стані. На багатьох платформах кожна зміна стану потенційно вимиває трубопровід. Набагато краще об'єднати подібні елементи разом і змінити стан один раз.


4
glEnable(GL_CULL_FACES);

Простий один вкладиш, який застосовує зворотний винос обличчя. Це відмінно підходить для обрізування багатокутника. Також зверніть увагу на відсіч Frustum / Occlusion для зменшення кількості полі.

Інша річ, на яку слід звернути увагу, це SIMD для ваших векторів та кватерніонів (в основному вони використовуються при обертаннях камер). Якщо ви не хочете возитися з ASM, тоді перегляньте libSIMD, яка є чудовою бібліотекою для роботи з SIMD в C.


4

Не використовуйте glGet *, коли ви маєте доступ до локальних змінних, наприклад:

  • Не запитуйте розмір текстур у OpenGL, зберігайте їх при завантаженні в змінних
  • Не запитуйте розміри ліній ширини / точок від OpenGL, коли ви можете зберігати зміни у вашій програмі

Ці дзвінки дійсно повільні

Перемістіть невикористані речі за межами glBegin - пункт glEnd (будь то glColor або glNormal чи щось інше), якщо він не змінюється всередині. OpenGL - машина стану, вона використовує останнє значення.


3

Мінімізація команд OpenGL є ключовим. Таким чином, ви повинні згрупувати всі команди малювання. Для 2d ігор корисно використовувати Altas Texture і намалювати всі спрайти, що мають однакову текстуру, в одній команді opengl.


Будь обережний. Менше і більше партій корисні, але залежно від цільової платформи "занадто великі" партії знизять продуктивність.
Андреас

3

Пакет, партія, партія !! (Ab) використовуйте GPU, щоб надати якомога більше під час кожного розіграшу дзвінка. Ігри здебільшого обмежені кількістю змін у державі, не стільки кількістю трикутників.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.