Как отформатировать отформатированный текст в Direct3D9? - PullRequest
0 голосов
/ 07 февраля 2010

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

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

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

1 Ответ

0 голосов
/ 07 февраля 2010

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

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

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

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

Не буду, потому что для этого нужно перенести содержимое текстуры из системной памяти в VRAM.

...