2010-01-15 6 views
1

J'ai une application MFC qui affiche des cartes annotées, qui peuvent inclure une grande quantité de texte. Alors que la taille et la police du texte n'ont pas tendance à changer beaucoup, la rotation du texte varie considérablement, afin d'être aligné avec le travail de la ligne environnante. Cela signifie essentiellement que je dois créer et sélectionner une nouvelle police dans le contexte d'affichage chaque fois que la rotation change. Quelque chose comme;Comment accélérer la sortie de texte pivotée dans 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); 

Ceci est évidemment lent lorsqu'il s'agit de grandes quantités de texte. Est-il possible d'accélérer ce processus sans passer par un autre moteur d'affichage comme D3D ou OpenGL? Autrement dit, puis-je changer la rotation du texte dans la police sélectionnée?

n.b. J'effectue déjà d'autres optimisations évidentes, comme s'assurer que le texte est à l'écran à une taille visible avant d'essayer de le dessiner.

Répondre

1

La création et la destruction de nombreux objets GDI peuvent être lentes. Ce que vous pouvez faire est de créer 360 polices au démarrage de votre programme afin que vous puissiez SelectObject() à partir d'une table de recherche avec des polices pré-faites à la bonne rotation, plutôt que de les créer à la demande. Ou vous pouvez faire pivoter votre texte en n'utilisant pas lfEscapement mais en utilisant SetWorldTransform() avec la matrice de rotation appropriée (encore une fois, vous pouvez mettre en cache les matrices de rotation pour la vitesse). Vous devriez tester si cela vous donnera un gain de vitesse.

Voir ma question ici SetWorldTransform() and font rotation pour un problème que j'ai eu/avoir avec cette approche, cependant (n'ai pas eu le temps d'y retourner et de regarder dedans).

+0

+1 pour pré-créer un tableau de polices à chaque degré de rotation, n'avait pas pensé à celui-là du tout, mais va essayer. Toute idée si je vais tomber en panne de limitations de ressources GDI si j'utilise ce type d'approche? –

+0

Si vous atteignez la limite du handle GDI, je ne vois pas vraiment de solution - la valeur par défaut est 10k, 360 est un petit pourcentage de cela, je pense que ce serait faisable. Je suppose que vous pourriez écrire un objet cache qui stockerait les X rotations les plus souvent utilisées (où X serait toujours <360) et remplacer les moins utilisées si une rotation qui n'est pas dans le cache est demandée, peut donner trop de coup de vitesse pour le rendre utile. Je suppose que vous pourriez découper toutes vos rotations à des multiples de 2, ou 3 ou 5, en fonction de mem reqs; Je doute que ce soit un problème, visuellement. – Roel

0

Vous devez d'abord le dessiner sur le DC invisible et ensuite le copier sur votre DC.

1

Etes-vous sûr que le problème est la police et non le TextOut?
L'idée d'Oleg d'utiliser un tampon arrière n'est pas mauvaise si vous voulez éviter le scintillement.

Si j'allais utiliser un moteur graphique, j'essaierais Cairo car il est spécialement conçu pour ce genre de travaux.

Questions connexes