OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 14:20

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 04 Март, 2015 13:54 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Текстовая надпись в 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. Идентификатор текстуры надо связать с этими данными, а при рендеринге кадра искать готовую текстуру (или добавлять новую по необходимости).

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Март, 2015 12:50 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Примеры SDL_TTF рендерятся очень быстро, поэтому, вероятно, проблема кроется где-то в ББ


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Март, 2015 13:01 

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 05 Март, 2015 18:02 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
В порядке эксперимента применил АВЛ-дерево для хранения кэша текстур. Скорость рендера тестового текста в 150 слов возросла в пять раз (если сравнивать с субтекстурированием) и в десять раз (если сравнить с обычным текстурированием) и перестала падать с увеличением слов на экране. При этом, естественно, используется обычное текстурирование. Успех налицо!

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB