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.
+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? –
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