Как ускорить вывод повернутого текста в MFC - PullRequest
1 голос
/ 15 января 2010

У меня есть приложение MFC, которое отображает аннотированные карты, которые могут содержать большое количество текста. Хотя размер и шрифт текста не сильно меняются, вращение текста значительно варьируется, чтобы выровняться с окружающей линией работы. Это в основном означает, что мне нужно создавать и выбирать новый шрифт в контексте дисплея каждый раз, когда меняется поворот. Что-то вроде;

if (TextRotationChanges)
{
    m_pFont = new CFont;
    m_lf.lfEscapement = NewRotation;
    m_pFont->CreateFontIndirect(&m_lf);
}
CFont *OldFont = m_pDC->SelectObject(m_pFont);
m_pDC->TextOut(x,y,text,strlen(text));
m_pDC->SelectObject(OldFont);

Это очевидно медленно при работе с большими объемами текста. Есть ли способ ускорить это, не переходя на другой движок дисплея, такой как D3D или OpenGL? Другими словами, можно ли изменить вращение текста существующим выбранным шрифтом?

n.b. Я уже выполняю другие очевидные оптимизации, такие как обеспечение отображения текста на экране в видимом размере перед попыткой его нарисовать.

Ответы [ 3 ]

1 голос
/ 15 января 2010

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

Если бы я собирался использовать графический движок, я бы попробовал Cairo , потому что он разработан специально для такого рода работ.
(он может отображаться непосредственно на поверхности Win32 DC)

1 голос
/ 15 января 2010

Создание и уничтожение многих объектов GDI может быть медленным. Что вы можете сделать, это создать 360 шрифтов при запуске вашей программы, чтобы вы могли выбрать SelectObject () из таблицы поиска с заранее созданными шрифтами в правильном порядке вращения, а не создавать их по требованию. Или вы можете вращать текст, не используя lfEscapement, а используя SetWorldTransform () с соответствующей матрицей вращения (опять же, вы можете кэшировать матрицы вращения для скорости). Вам нужно проверить, действительно ли это даст вам прирост скорости.

См. Мой вопрос здесь SetWorldTransform () и ротация шрифтов для проблемы, которая у меня была / есть с этим подходом, хотя (у меня не было времени вернуться и посмотреть на нее).

0 голосов
/ 15 января 2010

Сначала вы должны нарисовать его на невидимом DC, а затем скопировать на свой DC.

...