2009-08-18 6 views
3

J'ai travaillé sur du code GDI + dans .NET et j'ai appris mes leçons à la dure. Des choses simples comme:Règles du pouce dans GDI +

  • Ce qui ressemble bien à l'écran ne peut pas l'air bien sur le papier et vice versa
  • Mise en cache trop d'objets peuvent entraîner une OutOfMemoryException
  • Flotteurs ne sont pas exactes

...etc. Je suis sûr qu'il y a beaucoup plus de gens expérimentés qui peuvent ajouter à cela.

Quelles sont les bonnes règles à suivre lors de l'utilisation de GDI + ou d'une bibliothèque graphique en général?

Une astuce utile par poste sera agréable. Merci.

+0

[limites dures pour les valeurs XY dans GDI +] (http://stackoverflow.com/questions/3468495) –

Répondre

5

Créer des objets aussi tard que possible (Ne pas prématurément optimiser/cache) et les libérer le plus tôt possible (en appelant Dispose ou en utilisant wrapper en utilisant instruction si IDisposable).

2

Évitez d'utiliser des appels non gérés, cela peut accélérer considérablement les choses lorsque vous avez terminé correctement.

2

Attention lorsque vous transformez les coordonnées logiques/d'écran. Si cela est fait au mauvais moment, vous pouvez manquer de précision et obtenir des artefacts de dessin méchants en retour.

La dernière fois que j'ai mordu, j'essayais de calculer un nouveau point dans les coordonnées logiques; ceux-ci étaient déjà près de la limite de précision, donc le nouveau point n'était pas tout à fait ce que l'on espère. Transformer plus tôt l'a fixé.

Il est possible d'obtenir un problème similaire en transformant en coordonnées d'écran trop tôt, bien qu'une API qui vous permette de passer les coordonnées en virgule flottante (ce que GDI + fait) tend à être beaucoup plus robuste.

2

Ne dessinez pas plus que nécessaire.

En général, les opérations de dessin sont plus coûteuses que les autres calculs que vous effectuerez (en particulier dans GDI +, qui est une API sympa mais pas la bibliothèque de dessin la plus rapide de tous les temps). Passer un peu plus de temps dans votre propre code pour éviter les opérations de dessin inutiles (par exemple, dessiner la même chose plus d'une fois) en vaut souvent la peine.

2

GDI Gotchas qui m'ont brûlé plusieurs fois.

  • Le clonage ne clone pas() le clonage de données sous-jacent (Rectangle, PixelFormat). Donc, si vous disposez d'un clone(), l'objet d'origine devient inutilisable. Utilisez new Bitmap() si vous voulez deux bitmaps séparés.
  • Si vous chargez une image FromFile, ce fichier est verrouillé jusqu'à ce que l'image bitmap soit supprimée (impossible à lire). Lorsque vous utilisez DrawImage, n'oubliez pas de régler SmoothingMode, InterpolationMode et PixelOffsetMode ou vous serez surpris par la qualité médiocre de l'image.
1

Non strictement GDI + problème, mais rappelez-vous ceci pour vous épargner quelques heures de mise au point:

Une erreur que j'ai fait trop souvent en utilisant GDI + dans .NET est d'appeler Matrix méthodes sur la propriété Transform de l'objet Graphics.Exemple (en C++/CLI):

g->Transform->Translate(100.0f, 250.0f); // WRONG. Will not have any effect. 

Le getter de la propriété Transform renvoie uniquement une copie de la matrice. Toutes les méthodes appelées sur cette copie n'affectent donc pas la valeur de la transformation graphique. Pour manipuler la transformation graphique, appelez l'une des méthodes wrapper (MultiplyTransform, TranslateTransform, ScaleTransform, etc.) comme indiqué ci-dessous.

g->TranslateTransform(100.0f, 250.0f);