Caching von GDI + -Objekten in einer Winforms-Anwendung: Lohnt es sich und wie geht es richtig?

9

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%
  1. Gibt es einen besseren Weg für mich, diese GDI + -Objekte wiederzuverwenden, statt sie jedes Mal neu zu formatieren, wenn OnPaint() etc aufgerufen wird?
  2. Werden die GDI + -Objekte ein nicht verwaltetes Speicherleck verursachen, sobald das Programm beendet wird, oder wird der Finalizer für jedes Brush -Objekt aufgerufen, was wiederum nicht verwaltete Ressourcen freigibt?

Ich entschuldige mich, wenn das eine Wiederholung ist, aber ich habe keine ähnlichen Fragen gefunden.

    
Repo Man 14.02.2012, 23:03
quelle

2 Antworten

4

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%     
Dmitry Nogin 20.02.2012, 04:06
quelle
0

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.

    
Frank Hileman 13.03.2012 06:16
quelle