Cela peut ne pas être la réponse que vous cherchez, mais ne pas utiliser GDI + du tout. J'ai dû récemment réécrire la pile de rendu d'une application 2D-CAM, et l'exigence la plus importante était d'obtenir rapidement de bonnes lignes anti-aliasées (l'anti-aliasing nous a incités à réécrire le rendu GDI existant).
Voici quelques résultats obtenus avec un rendu de 200 articles (chaque article est lui-même quelques lignes et de petits marqueurs de formes pleines). Ce sont les taux de trame (sur Windows 7), donc plus élevé est mieux:
200 articles: GDI = 51, GDI + = 20, D2D = 59, WPF = 33, GL = 59.
(D2D est Direct2D, GL est OpenGL). Déjà vous pouvez voir que GDI + est à la traîne. WPF est peut-être handicapé en tant qu'API en mode retenu, mais OpenGL est également double-bufferisé et a l'air tout aussi fluide.
à 1000 éléments, la différence est plus marquée:
GDI = 23, GDI + = 5, D2D = 17, WPF = 2, GL = 40.
C'est vrai, WPF est tombé à 2 FPS maintenant, et GDI + rampe à 5 FPS. Alors, pensez à D2D, ou tout simplement revenir à OpenGL. C'est ce que nous utilisons maintenant et 3 mois après la réécriture, je pense que nous avons fait le bon choix. Le modèle de programmation lui-même est beaucoup plus propre que D2D semble l'être. Notez que le rendu WPF que nous utilisons est hautement optimisé; pas de rappels, pas d'événements, pas de liaison. Nous obtenons juste un DrawingContext et dessinons tout sur chaque image en utilisant les primitives de plus bas niveau, donc il n'y a pas de surcharge d'événement.
Si vous êtes intéressé, faites le moi savoir, et je peux vous envoyer les suites de test que j'ai utilisées pour que vous puissiez jouer avec ça.
(Une des raisons pour lesquelles je ne pense pas à GDI + est qu'il est peu probable qu'il soit accéléré matériellement).
Salut Jason, merci pour la réponse complète. Permettez-moi de répondre aux points un à un, peut-être que cela clarifiera un peu où je suis coincé: –
"Simplifiez ce que vous dessinez". Je suis, surtout. Mon GUI est en fait un ZUI, donc je simplifie déjà les choses lorsque je fais un zoom arrière. Cependant, je ne suis pas en train de prendre la décision de tirer ou non des choses en fonction du temps qu'il a fallu à la dernière image pour la dessiner. –
"Dessinez-vous l'intégralité de votre écran à chaque fois". Non, je ne dessine pas d'objets qui ne sont pas dans la zone visible. –