Quel est le moyen le plus rapide de dessiner du texte formaté dans l’API Win32?

Je suis en train d’implémenter un éditeur de texte en C ++ en utilisant simplement l’API Win32 de vanilla et j’essaie de trouver le meilleur moyen d’implémenter la coloration syntaxique. Je sais qu’il existe des contrôles existants comme scintilla, mais je le fais pour le plaisir alors je veux faire la plupart du travail moi-même. Je veux aussi que ce soit rapide et léger.

D’après ce que j’ai appris jusqu’ici, la fonction TextOut semble être l’option la plus basse pour dessiner du texte dans GDI. Cependant, si je dois continuer à changer la couleur de la police, cela signifie que je TextOut passer de nombreux appels à TextOut pour dessiner un corps de texte avec un formatage mixte. Est-ce inefficace? Lorsque la mise en évidence de la syntaxe et les contrôles de texte enrichi sont implémentés, sont-ils susceptibles d’utiliser TextOut arrière-plan ou existe-t-il un autre moyen? Toutes les autres méthodes de dessin de texte dans GDI ne sont-elles qu’une enveloppe de niveau supérieur autour de TextOut ?

DrawText et TextOut sont tous deux des wrappers pour ExtTextOut. ExtTextOut est donc l’API de bas niveau. Dans mon expérience, ExtTextOut est assez rapide, alors je doute que vous renconsortingez des problèmes de performance avec ExtTextOut lui-même. Toutefois, la création / sélection de fonts peut être source de problèmes de performances. Si vous passez d’une police à l’autre, vous pouvez gagner en performance en mettant en cache et en réutilisant les fonts (HFONT) plutôt que CreateFont / SelectObject / DeleteObject. Fondamentalement, la première fois que vous appelez SelectObject après avoir créé une nouvelle police, Windows exécutera un processus de correspondance de police pour trouver la police physique la mieux adaptée à la police logique que vous avez demandée. Il s’agit d’un processus assez complexe. Vous souhaitez donc minimiser le nombre de fois où la performance est importante.

Il y a plusieurs années, j’ai développé un contrôle d’édition riche qui était essentiellement une mini version de Microsoft Word. J’ai utilisé ExtTextOut comme outil de travail principal pour toutes les sorties de texte. Le contrôle conservait un cache de fonts des fonts les plus récemment utilisées (la taille du cache par défaut était de 10 fonts). Il supportait la mise en page WYSIWYG, il faisait donc toute la mise en page à l’aide d’une imprimante DC et de fonts, puis rendait une version compatible avec l’écran à l’aide d’un écran DC et de fonts similaires. ta situation. Malgré cela, les performances étaient excellentes sur le matériel typique du jour (par exemple, Pentium 266 MHz).

Au lieu de se demander quelle fonction “dessiner” est la plus rapide, il est probablement beaucoup plus avantageux de considérer “comment minimiser la quantité de texte à rendre”, en réfléchissant à ce qu’il faut redessiner / invalider lorsque le texte change. , ou comment on peut mettre en cache le texte rendu pour le défilement.

Pour une utilisation complexe, vous voudrez probablement DrawText car il vous donne plus de contrôle que TextOut . Il a un support de formatage de base, mais moins que ce dont vous avez besoin pour un éditeur. L’étape suivante est l’éditeur de texte enrichi de la bibliothèque de contrôles communs, qui s’occupe de tout pour vous.