2010-08-20 3 views
15

Ich habe eine Anwendung, die eine Los der Zeichnung tut, tun wir so tun, es ist eine Viso-ähnliche Anwendung. Es verfügt über Objekte, die mehrere Unterobjekte haben, die gezogen werden, können die Dinge verbunden werden, verändert usw. Zur Zeit, wenn ich Farbe auf einem bestimmten Unterobjekt oder Objekt aufrufen, ich folgendes tun:Soll ich neue Pens/Brushes pro Paint-Anforderung erstellen oder sie während des gesamten Anwendungslebenszyklus beibehalten?

using(var pen = new Pen(this.ForeColor)) 
{ 
    // Paint for this object. 
} 

Ich habe lesen Sie widersprüchliche Antworten, dass dies für eine Anwendung getan werden sollte, die ständig das Gleiche zeichnet (vielleicht nur Größe geändert, verschoben usw.). Sollte ich die Pen/Brush mit dem Objekt speichern und sie dann alle entsorgen, wenn die Anwendung entsorgt wird, oder sind sie effizient genug für Malanruf erstellt/entsorgt werden (daran zu erinnern, dass dies eine ziemlich grafikintensive Anwendung ist).

BEARBEITEN: Es gibt bereits zwei Antworten, die widersprüchliche Antworten haben und das ist, wo ich nicht sicher bin, den Schalter zu machen. Hat jemand irgendwelche Statistiken über die Unterschiede?

Antwort

9

Sie könnten natürlich die Klassen Pens und Brush verwenden, die Ihnen Objekte zur Verfügung stellen, die bereits von der Laufzeitumgebung erstellt wurden.

Zum Beispiel, wenn Sie eine der Standardfarbe wollen Pens, können Sie dies tun:

var pen = Pens.Red; 

Ebenso können Sie das gleiche tun mit Brushes, wenn Sie nur Standard-Fest Pinsel Farben wollen:

var brush = Brushes.Red 

Mit diesen müssen Sie sich nicht darum kümmern, sie zu säubern, zu entsorgen oder anderweitig.

Wenn Sie verschiedene Farben möchten, die Sie selbst erstellen, z. B. mit einer anderen Alphakomponente oder einem Farbverlaufsbürstchen, müssen Sie diese selbst erstellen und entsprechend aufbereiten.

EDIT:

So erstellen und verfügt über eine Reihe von 100.000 neuen Stiften dauerten etwa eine halbe Sekunde auf meiner alten alten XP-Maschine, einen Test-App im Debug-Modus ausgeführt wird.

Das entspricht etwa 5 Mikrosekunden pro Stift. Nur Sie können entscheiden, ob das für Sie schnell genug ist.Ich würde eine Vermutung wagen, dass diese Zeit im Hinblick auf den Rest Ihrer Operationen weitgehend unbedeutend sein kann.

+0

Ja, alle Stifte/Pinsel haben andere Farben als die vordefinierten Farben. – TheCloudlessSky

+0

OK, fair genug. Bitte beachten Sie die Bearbeitung meines Posts. – Andy

+0

Ich habe gerade ein paar Tests gemacht, bevor ich deinen Beitrag überprüft habe und du hast recht, es ist wahnsinnig schnell zu erstellen/zu entsorgen. Eine Optimierung ist in diesem Fall nicht notwendig. Vielen Dank! – TheCloudlessSky

1

Wiederverwendung der gleichen Pen und Brush in Operationen, die es viele Male benötigen wird viel schneller sein als die Entsorgung von ihnen jedes Mal mit using.

ich sicher sagen würde, dass es eine gute Idee, diese so weit wie möglich wieder zu verwenden (und ich habe vor Code Vergleiche gesehen, aber ich kann sie jetzt nicht Quelle) aber erinnern über sie verfügen wenn du wirklich mit ihnen fertig bist.

+1

Sie hätten keine Beweise dafür * wie * viel schneller? Ich möchte nicht optimieren, wenn es nicht wirklich notwendig ist. – TheCloudlessSky

0

Ja am besten zu testen wie @fantius suggeriert, Sie werden wahrscheinlich feststellen, dass es nicht wirklich wichtig ist - obwohl ich versucht wäre, sie offen zu halten, als ob ich mich richtig erinnere, sie sind unmanaged Ressourcen und könnten Ihre verbrauchen Erinnerung. Wenn Sie sie jedes Mal neu erstellen, müssen Sie besonders vorsichtig sein, um sie ordnungsgemäß zu entsorgen, um Speicherlecks zu vermeiden.

+0

Wenn sie jedes Mal neu erstellt werden, sind sie mit der Anweisung 'using' versehen. – TheCloudlessSky

3

Sie werden nur die Auswirkungen auf die Leistung durch Tests auf Ihrer speziellen Anwendung kennen, aber das Framework scheint kein Problem zu haben, ein paar Stifte für die Lebensdauer der Anwendung zu halten. Wenn Sie das erste Mal Pens.Black anrufen, wird ein schwarzer Stift erstellt und zwischengespeichert. Sie erhalten dasselbe Objekt für zukünftige Aufrufe zurück, und es wird nie explizit entfernt (Pens.Black.Dispose() wird tatsächlich eine Ausnahme auslösen). Sie möchten jedoch nicht blind Stifte erstellen und diese nach dem Beenden der Anwendung entsor- gen lassen, da sonst unmanaged Speicher verloren geht. Je nach Nutzungsverhalten in Ihrer App fallen Ihnen einige Optionen ein.

Geben Sie jedem Objekt einen privaten Stift, der erstellt wird, wenn ForeColor festgelegt und für alle Bilder wieder verwendet wird. Sie sollten Ihr Objekt IDisposable machen, damit es den Stift ordnungsgemäß entsorgen kann.

Wenn Sie relativ wenige unterschiedliche Farben verwenden, aber viele Objekte jede Farbe verwenden, möchten Sie möglicherweise nicht, dass jedes Objekt an seinem eigenen Stift festhält. Erstellen Sie eine Cache-Klasse, die eine Dictionary<Color,Pen> hält und sie über eine PenCache.GetPen(ForeColor) aushändigt. Wie mit Pens.Black, können Sie jetzt vergessen, sie zu entsorgen. Ein Problem tritt auf, wenn Sie eine Farbe kurz verwenden und dann nicht mehr benötigen. Der Stift wurde zwischengespeichert, damit Sie für immer in Erinnerung bleiben. Sie könnten stattdessen eine Dictionary<Color,WeakReference<Pen>> behalten, die es erlaubt, im Cache gespeicherte Stifte zu sammeln, wenn sie nicht mehr benötigt werden.

Diese letzte Option kann die beste Allzwecklösung sein, die unnötige Erstellung und Entsorgung vermeidet, während der Garbage Collector dafür sorgen muss, dass verwaiste Stifte nicht zu viele Speicherprobleme verursachen. Es kann natürlich in Ihrem speziellen Fall nicht besser sein.

+0

+1 da ich wirklich die Idee der Verwendung von 'WeafReference' mag. Ich werde mehr darüber für ein anderes Projekt lesen müssen. Ich habe durch Tests festgestellt, dass das Erstellen/Entsorgen von Pens/Brushes ziemlich effizient ist, also habe ich Andys Antwort akzeptiert. – TheCloudlessSky

+0

Ich weiß nicht, ob es den Schmerz wert ist. Eigentlich hat Pen eine Menge Optionen, nicht nur in der Farbe. Breite, Pinsel, Stil, Muster, Cap. Wenn Sie alle brauchen, wird es ein Schmerz sein – GorillaApe

Verwandte Themen