Как максимально быстро отрисовать D3DXFont с помощью D3DXSprite в DirectX 9?

Мне нужно нарисовать много текста. Если я вызову D3DXFont::DrawText с первым параметром NULL, я получу ужасную производительность.

Я слышал, что использование D3DXFont в сочетании с D3DXSprites значительно ускоряет работу.

Как моему приложению нужно рисовать строки? Он рисует каждую строку псевдотенью. Это означает, что я рисую каждую строку 4 раза черным цветом: x + 1, y + 1 x - 1, y + 1 x - 1, y - 1 x + 1, y - 1 и 1 раз в реальном цвете. Это делает очень красиво выглядящие всегда читаемые строки. Я даже переключился на пиксельные шрифты для более быстрого рендеринга.

Теперь вызовите эту строку с тенью (ShadowString).

В каждом кадре я рисую 256 (в худшем случае) этих ShadowStrings на экране.

Я хотел бы знать, как использовать спрайты (или любой другой метод), чтобы максимально ускорить отрисовку этих строк). Теперь я получаю 30 кадров в секунду в приложении. Но я ориентируюсь на 120 мин. И проблема ТОЛЬКО в том, что рисование текста.


person Hooch    schedule 25.12.2013    source источник


Ответы (1)


Конечно, вы должны профилировать свое приложение перед любой оптимизацией, но, по правде говоря, D3DXFont/D3DXSprites и "быстро" - это взаимоисключающие понятия. Если они не подходят, просто не используйте их. Используйте сторонние библиотеки или создайте собственный рендерер спрайтов/шрифтов.

Недавно я ответил о том, как это сделать здесь: Как рисовать линии и шрифты без D3DX9 в DirectX 9? Также погуглите "шрифт спрайтов", "пакетирование спрайтов", "атласы текстур", "рендеринг TTF". Это не очень сложно, если вы знакомы с API (в частности, с буферами вершин и текстурированием), и в Интернете есть множество примеров. Не стесняйтесь искать примеры D3D11 или OpenGL, принципы те же.

person Ivan Aksamentov - Drop    schedule 25.12.2013
comment
Я вижу, ты знаешь D3D. Можете ли вы сказать мне, как я могу преобразовать строку в спрайт и отобразить этот один спрайт несколько раз? Я думаю, что сокращение рендеринга текста в 5 раз должно увеличить производительность до приемлемого уровня. - person Hooch; 26.12.2013
comment
Есть ссылка на мой недавний ответ, я просто не хотел копировать и вставлять одно и то же. В этом ответе я шаг за шагом объяснил, как это сделать. В частности, вы можете использовать библиотеку FreeType для преобразования символов из файла шрифта .ttf в растровое изображение и использовать изображения этих символов в качестве текстур для небольших квадратов. Это базовая, широко распространенная техника. Конечно, вы можете развернуть свой собственный анализатор TTF вместо FreeType, но это может быть сложно. Дальнейшие оптимизации кратко описаны в связанном ответе. - person Ivan Aksamentov - Drop; 26.12.2013