OberonCore
https://forum.oberoncore.ru/

Оптимизация вывода текста в OpenGL-BlackBox
https://forum.oberoncore.ru/viewtopic.php?f=23&t=5352
Страница 1 из 1

Автор:  Иван Кузьмицкий [ Среда, 04 Март, 2015 13:54 ]
Заголовок сообщения:  Оптимизация вывода текста в OpenGL-BlackBox

Текстовая надпись в x86sdlhostPorts.Rider.DrawString создаётся в три этапа:
1) Генерация растра с помощью SDL_TTF
2) Создание текстуры из растра.
3) Натягивание текстуры на прямоугольник.

Генерация растра и создание текстуры - самые тяжёлые операции. Было принято решение оптимизировать этап создания текстуры. Для этого однократно создаётся большая текстура (например, 512х512), а растр из SDL_TTF внедряется в неё как субтекстура с помощью glTexSubImage. Субтекстурирование гораздо быстрее (по моим замерам, в два раза), чем glTexImage, поэтому общий прирост производительности оказался значительным, примерно в 1.6 раза.

До оптимизации: время рендера кадра 0.0053 сек, строка в 30 символов рендерится 3000 раз\сек.
После оптимизации: время рендера кадра 0.0033 сек, строка в 30 символов рендерится 5000 раз\сек.

Скорость рендеринга текстовых документов возросла примерно в два раза. Но этого совершенно недостаточно для гладкой визуализации. Вообще, хорошо известно, что создание текстур "на лету" плохой путь. Поэтому надо готовить текстуры по возможности, заранее. Это сработает, потому что 99% времени рендеринга текст на экране не меняется.

Вопрос только в построении эффективного алгоритма кэширования. Входные данные - цепочка символов и объект шрифта Fonts.Font. Идентификатор текстуры надо связать с этими данными, а при рендеринге кадра искать готовую текстуру (или добавлять новую по необходимости).

Что тут можно придумать, подскажите?

Автор:  Kemet [ Четверг, 05 Март, 2015 12:50 ]
Заголовок сообщения:  Re: Оптимизация вывода текста в OpenGL-BlackBox

Примеры SDL_TTF рендерятся очень быстро, поэтому, вероятно, проблема кроется где-то в ББ

Автор:  Иван Кузьмицкий [ Четверг, 05 Март, 2015 13:01 ]
Заголовок сообщения:  Re: Оптимизация вывода текста в OpenGL-BlackBox

Kemet писал(а):
Примеры SDL_TTF рендерятся очень быстро, поэтому, вероятно, проблема кроется где-то в ББ
Не, именно что создание OpenGL-текстуры из SDL_Surface тормозит. Забирает на себя не менее 60% всего времени выполнения DrawString. Вызов SDL_RenderUNICODE_Blended отнимает... ну, процентов 15.

Тут самое лучшее решение - вообще не рендерить текстуру, если уже есть готовая.

Автор:  Иван Кузьмицкий [ Четверг, 05 Март, 2015 18:02 ]
Заголовок сообщения:  Re: Оптимизация вывода текста в OpenGL-BlackBox

В порядке эксперимента применил АВЛ-дерево для хранения кэша текстур. Скорость рендера тестового текста в 150 слов возросла в пять раз (если сравнивать с субтекстурированием) и в десять раз (если сравнить с обычным текстурированием) и перестала падать с увеличением слов на экране. При этом, естественно, используется обычное текстурирование. Успех налицо!

Исходник дерева скопипастил из примеров для книги "Алгоритмы и структуры данных", некоторые прикладные моменты подсмотрел в ListsDict.

Теперь осталось расширить ключ дерева, добавить стиль шрифта. Или делать "дерево в дереве". Вероятно, полезным окажется префиксное дерево. И добавить темпоральную деградацию дерева, с постепенным уничтожением неиспользуемых текстур.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/