Für einige meiner Winforms-Anwendungen muss ich eine ganze Reihe von GDI + -Objekten (Pinsel, Stifte, Schriftarten usw.) erstellen und sie immer wieder verwenden. Ich habe ein Ghetto-Caching-Singleton erstellt, um das zu erreichen, was ich brauche, aber der Code-Geruch ist überwältigend ...
%Vor%OnPaint()
etc aufgerufen wird? Brush
-Objekt aufgerufen, was wiederum nicht verwaltete Ressourcen freigibt? Ich entschuldige mich, wenn das eine Wiederholung ist, aber ich habe keine ähnlichen Fragen gefunden.
Es wird keinen Speicherverlust geben, aber es ist besser, GDI + -Objekte zu veröffentlichen, wenn es für Sie sinnvoll ist. Es gibt eine begrenzte Anzahl von ihnen im Betriebssystem, so dass Sie möglicherweise Rendering-Probleme in Ihrer und anderen Anwendungen verursachen. Eine andere Sache, die erwähnt werden sollte, ist die Unfähigkeit von GDI + -Objekten (Schriftarten usw.), von 2+ Threads gleichzeitig verwendet zu werden (einige schwierig zu reproduzierende Ausnahmen könnten ausgelöst werden). Sie könnten an einigen Messungen der tatsächlichen GDI + -Objekt-Erstellungszeit im Vergleich zu möglichen exklusiven Sperrverzögerungen interessiert sein. "vorzeitige Optimierung ist die Wurzel allen Übels" © Donald Knuth
Tatsächlich funktioniert es für mich, einige GDI + -Objekte zwischenzuspeichern: pro Malzyklus. Client-Code könnte folgendermaßen aussehen:
%Vor%Wir brauchen also GraphicsPalette, um die verschachtelte Konstruktion zu ignorieren und den gleichen Pinsel für einen bestimmten Thread zurückzugeben. Die vorgeschlagene Lösung:
%Vor%Aufgrund meiner Erfahrung mit VG.net glaube ich nicht, dass das Caching von GDI + -Objekten normalerweise die Mühe wert ist, außer für große Dinge wie Bitmaps. Natürlich ist es einfach zu messen.
Tags und Links .net c# winforms gdi+ system.drawing