Оптимизация вывода текста

Использование субтекстурирования OpenGL
Added by Иван Кузьмицкий over 4 years ago

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

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

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

Дальше надо думать, как ускорить генерацию самого растра.

P.S. Убрал ненужную конвертацию из формата ARGB в BGRA при создании растра шрифта. Это значительно ускоряет дело при рендере текста больших размеров, так как скорость тут падала пропорционально площади текстуры. Прикинул прирост производительности: на маленьких (размер 8-10) шрифтах 15%, на больших (> 40) уже в разы.


Comments