2010-02-07 3 views
0

Я пишу приложение, которое должно нарисовать много текста - несколько строк, может быть, десятки строк - в Direct3D9. Текст может быть сильно отформатирован (т. Е. Разные шрифты, стили, размеры) и может содержать символы Unicode из разных кодировок. Хуже всего, он может меняться «на лету», поэтому он должен быть динамическим (визуализировать, как только дисплей всегда не будет делать).Как отформатировать форматированный текст в Direct3D9?

Есть две проблемы с этим: во-первых, мне, вероятно, потребуется много звонков в D3DXCreateFont, которые предположительно являются дорогостоящими (я не уверен сам). Другой подход заключается в создании всех шрифтов, прежде чем рисовать многочастную линию, а затем просто переключаться между ними - это лучше? Ну, я также могу создавать объекты шрифта «на лету», когда я рисую строку, добавляю их в какой-то кеш-шрифт, а затем просматриваю кеш, прежде чем пытаться создать новый? Как вы думаете, какой подход лучше всего подходит?

Вторая проблема заключается в том, что D3DXFont, похоже, не понимает стили подчеркивания/прокрутки шрифтов. Хотя D3DFONT основан на LOGFONT, он пропускает эти поля (поддерживается курсивом, хотя). Скажем, мне действительно нужно подчеркнуть/пробить, что мне делать? Есть ли способ заставить ID3DXFont подчеркнуть? Должен ли я просто нарисовать эти строки сам (как мне это сделать быстро)? Или, может быть, мне нужно переключиться на рисование с помощью GDI на HDC, а затем скопировать эти пиксели в текстуру - это обеспечит разумную производительность?

ответ

0

Ну, я также могу создавать объекты шрифта «на лету», когда я рисую строку, добавляю их к какому-то типу-объекту-кешу, а затем заглядываю в кеш, прежде чем пытаться создать новый? Как вы думаете, какой подход лучше всего подходит?

Кэширующий подход. Даже не пытайтесь воссоздавать шрифты «на лету», когда вам это нужно, без кеширования. Я не знаю реальной стоимости D3DXCreateFont, но функция по дизайну не предназначена для слишком частого вызова.

Что касается подчеркивания/вычеркивания - вы можете визуализировать линии самостоятельно сверху, используя IDirect3DDevice9::DrawPrimitiveUP с D3DPT_LINELIST и проходной шейдер, чтобы оставить линейные вершины неизменными и нетрансформированными.

Возможно, мне нужно переключиться на рисование с помощью GDI на HDC, а затем скопировать эти пиксели в текстуру - это обеспечит разумную производительность?

Я не буду, потому что ему необходимо передать содержимое текстуры из ОЗУ системы в VRAM.

+0

Спасибо! Я использовал метод кэширования, отлично работает. – himself

Смежные вопросы