Wie spart das WPF-Abhängigkeitseigenschaftsdesign den Speicherverbrauch?

8

Ich habe das in folgendem Link gelesen: -

Ссылка

  

Da GetValue und SetValue jedoch intern ein effizientes Sparse-Speichersystem verwenden und IsDefaultProperty ein statisches Feld (und nicht ein Instanzfeld) ist, speichert die Implementierung der Abhängigkeitseigenschaft den Speicher pro Instanz im Vergleich zu einer typischen .NET-Eigenschaft. Wenn alle Eigenschaften von WPF-Steuerelementen Wrapper um Instanzfelder wären (wie die meisten .NET-Eigenschaften), würden sie aufgrund der allen Instanzen zugeordneten lokalen Daten eine erhebliche Menge an Speicher belegen.

Aber irgendwann werden sie irgendwo gespeichert, wie spart es Speicherverbrauch?

    
teenup 21.08.2011, 08:51
quelle

2 Antworten

17

Siehe folgenden Link: Ссылка

  

Was von einem Objekt als Abhängigkeitseigenschaft deklariert wird, ist tatsächlich   nichts mehr als ein Identifikator. Diese statische "Eigenschaft" ist wirklich ein   Schlüssel, der ein Objekt einer bestimmten Speicher-ID zuordnet. Zum   Beispiele für grafische Objekte haben eine Hintergrundeigenschaft, die festgelegt werden kann   explizit oder durch die Verwendung von Vorlagen oder Stilen.

Solange eine Abhängigkeitseigenschaft ihren Standardzustand verwendet (was sehr gebräuchlich ist), nimmt sie keinen zusätzlichen Speicher auf, da der Standardwert verwendet wird. Der Standardwert wird nicht pro Instanz gespeichert, er wird pro Abhängigkeitseigenschaft gespeichert und wird durch Metadaten festgelegt.

Beispiel, beachten Sie, wie Brushes.Black als Standardwert festgelegt ist

%Vor%

Überlege es dir so: Angenommen du hast vier TextBlocks in Xaml

%Vor%

Die drei TextBlocks oben haben Foreground auf Schwarz gesetzt, obwohl Sie sie nie explizit auf Schwarz gesetzt haben. Sie verwenden ihren Standardwert. Also für die Eigenschaft Foreground für die obigen drei TextBlocks benötigen Sie nur ein Feld (da es ein statisches Feld ist).

Für das vierte TextBlock haben Sie jedoch Foreground explizit auf Grün gesetzt, so dass der Wert als lokaler Wert für Foreground in dieser Instanz in ein Dictionary eingefügt wird und somit zusätzlichen Speicher erfordert (auch , wird es an der Stelle Nummer 3 in der folgenden Liste enden, wobei Setters , Triggers etc) überschrieben werden. .

Siehe auch den folgenden Beitrag von Josh Smith, der eine gute Lektüre enthält: Entmystifizierung von Abhängigkeitseigenschaften

  

Es gibt einen wohldefinierten Regelsatz, der intern von WPF verwendet wird   um herauszufinden, was der wahre Wert eines DP ist. Hier ist eine kurze Zusammenfassung   der Präzedenzregeln, die beim Auflösen des Wertes eines DP verwendet werden (lesen   mehr dazu hier ):

     
  1. Nötigung des Immobiliensystems
  2.   
  3. Aktive Animationen oder Animationen mit einem Halteverhalten
  4.   
  5. Lokaler Wert
  6.   
  7. Vorlagenvorlage
  8.   
  9. Stil-Trigger
  10.   
  11. Vorlagenauslöser
  12.   
  13. Stilsetzer
  14.   
  15. Themenstil
  16.   
  17. Vererbung
  18.   
  19. Standardwert aus Abhängigkeitseigenschaftsmetadaten
  20.   

Bearbeiten: Um den Kommentar von Duane zu beantworten

Wenn Sie den Wert explizit auf den gleichen Wert wie den Standardwert setzen, wird er trotzdem als lokaler Wert gespeichert. Dies kann leicht mit dem folgenden Xaml verifiziert werden.

Bei% TextBlocks wird Foreground auf Schwarz gesetzt, bei der letzteren wird jedoch ein lokaler Wert festgelegt. Der Style kann Foreground nur für den ersten TextBlock und nicht den späteren% setzen, da Style-Setter eine niedrigere Priorität als der lokale Wert haben.

%Vor%     
Fredrik Hedblad 21.08.2011, 10:00
quelle
5

Angenommen, Sie erstellen eine Klasse mit einem Dutzend Eigenschaften. Erstelle 100.000 von ihnen. Wie viele Objektreferenzen haben Sie jetzt? 1.200.000.

Implementieren Sie jetzt eine Klasse namens DependencyObject :

%Vor%

Erstellen Sie eine abgeleitete Klasse wie folgt:

%Vor%

Erstelle nun 100.000 Instanzen von MyDependencyObject und setze ihre Parent . Wie viele Objektreferenzen werden verwendet (ohne das übergeordnete Element)? 300.000.

So funktioniert die Vererbung von Eigenschaftswerten in Abhängigkeitsobjekten.

    
Robert Rossney 21.08.2011 18:40
quelle

Tags und Links