Методы оптимизации под OPENGL - page 1

1
УДК 004.925
Методы оптимизации под OPENGL
© И.В. Дикан, Ю.С. Белов
КФ МГТУ им. Н.Э. Баумана, Калуга, 248000, Россия
Рассмотрены основные методы оптимизации графических приложений, написанных с
использованием OpenGL. Описаны методы низкоуровневой оптимизации, в том числе
использующие различные расширения OpenGL. Приведены улучшенные методы отри-
совки графических объектов. Изложены методы изменения формата графических
объектов для повышения производительности конечных приложений.
Ключевые слова:
VBO, VAO, OpenGL, 3D-графика, DXT, оптимизация, шейдеры,
MipMapping, Occlusion Query, Frustum Culling.
Оптимизация рендеринга является важным этапом разработки
конечного приложения, поскольку позволяет увеличить число кадров
в секунду, снизить требования к аппаратному обеспечению в прило-
жениях реального времени, а для рендеров — уменьшить время, за-
трачиваемое на отрисовку конечной сцены. При нарушении принци-
пов оптимизации мы можем получить низкую производительность
даже на самых простых сценах, поэтому не стоит пренебрегать ими.
Большинство способов оптимизации основано на использовании
специализированных расширений драйвера, о которых многие разра-
ботчики забывают или вовсе не хотят знать. Однако одними расши-
рениями не обойтись — спектр проблем, которые необходимо ре-
шить, слишком велик и затрагивает множество подсистем рендерин-
га. При этом стоит учитывать, что увеличение производительности от
использования одного или нескольких методов может быть мини-
мально, а может достигать 100 % и более. Все зависит от особенно-
стей приложения.
Рассмотрим основные методы оптимизации приложений: низко-
уровневые, рисования моделей и оптимизации моделей.
Низкоуровневые оптимизации.
Использование старых функций
OpenGL, например Begin-End, серьезно уменьшает производитель-
ность, поскольку они имеют большие накладные расходы. К тому же
в новых версиях OpenGL эти функции объявлены как deprecated. От
них следует отказаться в пользу новых расширений типа
ARB_vertex_buffer_object (VBO), позволяющих хранить вертексы в
одном буфере в памяти GPU. Следующий пример демонстрирует
разницу старого и нового подходов:
struct Vertex {
float x, y, z;
}
1 2,3,4,5,6,7,8,9,10,...11
Powered by FlippingBook