Советы по оптимизации OpenGL [закрыто]

26

Какие у вас есть советы или рекомендации по повышению эффективности OpenGL?

тиргл
источник

Ответы:

16

Используйте VBO, а не glStart () / glEnd (). Это экономит циклы при передаче данных в память графического процессора.

MrValdez
источник
7
Более того, glBegin и glEnd устарели в более поздних версиях и были полностью удалены (и поэтому не будут работать) в версиях 3.x и выше. Если вы запросите контекст OpenGL 3.x, вы не сможете использовать их полностью.
хлебает Mad Разрывы
DirectX фактически навязывает вам это, у него нет эквивалента glStart()/glEnd().
knight666
@SAHChandler Я не знал этого. Я не понял, что это устарело.
MrValdez
3
@SAHChandler: Это отстой! Я выучил все свои рисунки с помощью glBegin () и glEnd (). Noooo !!!
8

Стандартный наконечник профиля, профиля, профиля применяется здесь также хорошо, хотя инструменты немного отличаются.

gDEBugger отлично помогает вам точно понять, что происходит под капотом. Это дорого, хотя.

тетрада
источник
2
Просто хотел добавить, что теперь это бесплатно.
DMan
8

Они взяты из документации Apple по OpenGL, но каждый немного помогает, не так ли? ;)

Оптимизация производительности OpenGL: основы
Оптимизация пропускной способности данных OpenGL в OS X

(Это последний пример приложения)
Оптимизация вершин

Существует также очень большое количество видео по этой теме (также от Apple), в которых рассказывается о расширениях OpenGL. Некоторые из них специфичны для OS X, но некоторые другие более обобщены и, скорее всего, могут быть применены к Windows и Linux.

Вы можете найти видео здесь . Тем не менее, вам требуется iTunes и учетная запись Apple для их просмотра (но они бесплатны!: D)

Slurps Mad Rips
источник
7

Ну, это действительно очень зависит от того, что вы планируете делать, но вот основы:

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

  • Делай свое освещение в шейдере. Это не только поможет сохранить ваше здравомыслие, но и позволит вам очень крутые вещи, такие как шейдеры Toon и отложенное освещение .

  • Частицы сосут. Даже при использовании точечных спрайтов OpenGL.

knight666
источник
6

Минимизируйте изменения вашего состояния. На многих платформах каждое изменение состояния потенциально сбрасывает конвейер. Гораздо лучше собирать похожие вещи вместе и менять состояние один раз.

Деннис Манси
источник
4
glEnable(GL_CULL_FACES);

Простой один лайнер, который применяет отбраковку лицевой стороны. Это отлично подходит для сокращения количества полигонов. Также обратите внимание на отбор Frustum / Occlusion для уменьшения числа поли.

Еще одна вещь, на которую стоит обратить внимание, это SIMD для ваших векторов и кватернионов (в основном используется при поворотах камеры). Если вы не хотите связываться с ASM, посмотрите libSIMD, которая является отличной библиотекой для обработки SIMD на C.

Krankzinnig
источник
4

Не используйте glGet *, когда вы можете получить доступ к локальным переменным, например:

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

Эти звонки очень медленные

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

Кромстер говорит, что поддерживает Монику
источник
3

Минимизация команд OpenGL - это ключ. Таким образом, вы должны пакетировать все команды рисования. Для 2D-игр рекомендуется использовать Altas Texture и рисовать все спрайты с одинаковой текстурой в одной команде opengl.

Эллис
источник
Быть осторожен. Полезны меньшие и большие партии, но в зависимости от целевой платформы «слишком большие» партии снижают производительность.
Андреас
3

Партия, партия, партия !! (Ab) использовать графический процессор для максимально возможного рендеринга при каждом вызове отрисовки. Игры в основном ограничены количеством изменений состояния, не столько количеством треугольников.

Hannesh
источник