Pergunta

Eu tenho um aplicativo MFC que exibe mapas anotados, que podem incluir uma grande quantidade de texto. Embora o tamanho e a fonte do texto não tendam a mudar muito, a rotação do texto varia consideravelmente, para estar alinhada com o trabalho da linha circundante. Isso basicamente significa que eu tenho que criar e selecionar uma nova fonte no contexto da tela cada vez que a rotação muda. Algo como;

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);

Isso é obviamente lento ao lidar com grandes quantidades de texto. Existe alguma maneira de acelerar isso sem ir a um mecanismo de exibição diferente, como D3D ou OpenGL? Em outras palavras, posso alterar a rotação de texto na fonte selecionada existente?

NB já estou realizando outras otimizações óbvias, como garantir que o texto esteja na tela em um tamanho visível antes de tentar desenhá -lo.

Foi útil?

Solução

Criar e destruir muitos objetos GDI pode ser lento. O que você pode fazer é criar 360 fontes na inicialização do seu programa para que você possa selecionar ojetObject () a partir de uma tabela de pesquisa com fontes pré-fabricadas na rotação correta, em vez de criá-las sob demanda. Ou você pode girar seu texto não usando o LFESCAPEMENT, mas usando o setWorldTransform () com a matriz de rotação apropriada (novamente, você pode cache as matrizes de rotação para velocidade). Você teria que testar se ele realmente lhe dará um ganho de velocidade.

Veja minha pergunta aqui Setworldtransform () e rotação de fontes Para um problema que tive/tive com essa abordagem (não tive tempo de voltar e olhar para ela).

Outras dicas

Tem certeza de que o problema é a fonte e não o TextOut?
A idéia de Oleg de usar um buffer de traseiro não é ruim se você deseja evitar a sacola.

Se eu fosse usar um mecanismo gráfico, tentaria Cairo Porque foi projetado especificamente para esse tipo de trabalho.
(Ele pode renderizar diretamente nas superfícies Win32 DC)

Você deve primeiro desenhá -lo no DC invisível e a que copie para o seu DC.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top