Оптимизация графического движка на библиотеке OpenGL Что такое OpenGL • OpenGL (Open Graphics Library — открытая графическая библиотека) — спецификация, определяющая независимый от языка программирования платформонезависимый программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику. Краткая история OpenGL • • • • В 1992 году компания SGI возглавила OpenGL ARB — группу компаний по разработке спецификации OpenGL OpenGL 2.0. Говорили, что по сравнению с DirectX главной проблемой OpenGL является Консорциум (который и должен заниматься развитием OpenGL) , в который входит большое количество компаний с различными интересами, что приводит к длительному периоду принятия новой версии спецификации. В ответ на это в сентябре 2001 года была представлена спецификация OpenGL 2.0. Наиболее значимое дополнение в нем – язык шейдеров, позволяющий программисту заменить фиксированный конвейер OpenGL небольшими программами на специальном языке для создания различных эффектов. 11 августа 2008 года была представлена новая версия спецификации OpenGL - OpenGL 3.0 11 марта 2010 года – OpenGL 4.0 Краткая история компьютерной графики • 1960-е – зарождение компьютерной графики, изображения рисуются символами (ACSII - графика) и выводятся на принтер • После создания ЭЛТ, мониторы на её основе дали следующий толчок к развитию графики, появилась возможность выводить отдельные точки и линии, стали появляться алгоритмы кривых линий и различных фигур, а сама компьютерная графика становилась больше наукой, чем развлечением • Постепенно начало осваиваться третье измерение, появились рисунки, создающие иллюзию глубины — Какая занятная репродукция Джоконды — Да Что Вы, Людмила Прокофьевна, это ж не репродукция, это ж наша вычислительная машина. Боровских запрограммировал. Уже месяц висит. — Да что Вы, не замечала… © Служебный роман (\___/) (='.'=) (")_(") Заяц Задача оптимизации • Основная задача оптимизации ускорение работы по визуализации, что дает возможности визуализировать объекты более полно, ускоряет прорисовку динамических систем и т.п. На что тратится время? Для того, чтобы понять, что же нужно сделать для ускорения работы графического конвеера, нужно понять, что отнимает время при его работе. В основном это: 1) Обработка полигонов, расчеты, связанные с положением полигонов в пространстве 2) Фильтрация, постобработка 3) Смена настроек, стека матрицы Средства достижения цели • • • • • Обработка полигонов: Время рисования кадра очень сильно зависит от количества обрабатываемых полигонов. При формировании сцен очень много полигонов не попадают в конечный кадр, соответственно, нужно уменьшить их количество. Есть различные способы сделать это: Не рисовать внутреннюю сторону фигуры Отрезать невидимые части сцены Отрезать невидимые части фигур Если модель на расстоянии, можно уменьшить количество полигонов модели OpenGL позволяет использовать для полигонов память видеокарты, которая дает значительное ускорение по сравнению с использованием оперативной памяти Средства достижения цели • • Расчеты, связанные с положением полигонов в пространстве. Положение вершин полигонов рассчитывается с помощью матрицы 4x4. Способы оптимизации данного процесса: В OpenGL есть специальная команда, рассчитывающая определенные вычисления до начала выполнения программы (например, для статических поверхностей), и записывающая результаты в скоростную память видеокарты Также полезна правильная организация стеков (наборов матриц) Средства достижения цели Фильтрация, постобработка. Для гладкости картинки и добавления различных эффектов используются фильтры и обработка уже готового кадра. Однако большинство часто используемых алгоритмов имеют хорошо продуманные общедоступные паттерны (шаблоны). Средства достижения цели • • Смена настроек. При больших количествах полигонов смена настроек для каждого полигона может заметно снизить скорость визуализации. Чтобы избежать этого, можно: Сортировать полигоны по определенным настройкам (чаще всего сортировка производится по текстурам, также можно сортировать по типу освещения, цвету и т.п.) Организация стека проекции также может ускорить работу движка. Конец (\___/) (='.'=) (")_(")