2010-11-18 7 views
2

Wir konnten eine hohe CPU-Auslastung Problem lösen, indem sie die Vorteile von Silverlight Bitmap-Cache nehmen, wie hier beschrieben:Was ist der Nachteil von Bitmap-Caching in Silverlight 4?

Wir haben den EnableGPUAcceleration Parameter an die <Objekt> tag. Um die CPU-Auslastung auf ein vernünftiges Niveau zu bringen, mussten wir CacheMode = "BitmapCache" zum visuellen Wurzelgitter für die gesamte App hinzufügen. Ich frage mich, ob es irgendwelche Nachteile hat, sich so sehr auf den Bitmap-Cache zu verlassen. Wenn es immer vorteilhaft war, nehme ich an, dass es standardmäßig aktiviert wäre.

fand ich diese ähnliche Frage mit einer guten Antwort von AnthonyWJones:

So ein Nachteil ist, dass es mehr Video-RAM verwendet. Ich denke, das könnte die Situation für andere grafikintensive Apps, die gleichzeitig laufen, noch verschlimmern. Gibt es noch andere Nachteile?

Wenn die Grafikkarte nicht über genügend Video-RAM verfügt, um alles zwischenzuspeichern, gehe ich davon aus, dass Silverlight in Ordnung ist und nur mehr CPU-Zyklen benötigt, um die Benutzeroberfläche neu zu rendern.


Danke für Ihre Hilfe,
Richard

Antwort

5

Nachdem wir viel mit Bitmap-Caching experimentiert hatten, haben wir es in unserer Anwendung deaktiviert. Es funktioniert gut, wenn Sie die GPU verwenden möchten, um Transformationen auf einem Teil Ihrer Benutzeroberfläche auszuführen, der sich nicht ändert - zum Beispiel, wenn Sie ein Bild haben, das Sie animieren, zerquetschen, drehen usw. Aber Bitmap Caching/GPU-Beschleunigung (in der aktuellen Implementierung) verlangsamt die Dinge ziemlich drastisch, wenn Sie weiterhin den visuellen Baum innerhalb des Teils Ihrer UI aktualisieren, den Sie cachen/manipulieren möchten. Wenn Sie sich nur um eine statische Bitmap bewegen, ist es sinnvoll, sie zwischenzuspeichern und mit der GPU zu beschleunigen. Aber ziemlich oft können Sie Stücke irgendwo im visuellen Baum von dem Stück Ihrer UI optimieren, das Sie zum Zwischenspeichern markiert haben, und wenn das passiert, müssen Sie den Cache der GPU jeden Frame aktualisieren, und das ist langsam, langsam, langsam.

Mit anderen Worten, ob es für Sie sinnvoll ist, es zu aktivieren oder nicht, hängt ganz von wo Sie es einschalten, und was Ihre Anwendung tut.Aus diesem Grund empfehlen wir bei Verwendung von Bitmap-Caching oder bei Leistungsproblemen mit Ihrer Silverlight-Benutzeroberfläche (vorübergehend) cache visualization und redraw regions. Macht Ihre App funky wie Hölle, wenn sie eingeschaltet sind, aber sie sind von unschätzbarem Wert, wenn es darum geht zu sehen, was Ihre UI tut, die Ihre gesamte CPU kauen wird.

+0

Danke! Das macht Sinn. Daher kann das Zwischenspeichern die Vorgänge verlangsamen, wenn sich der zwischengespeicherte Bereich häufig ändert, da der Cache ständig ungültig gemacht und erneut zwischengespeichert werden muss. Leider weiß ich nicht, warum es neu gezeichnet wird. Ich habe Redraw-Bereiche aktiviert, und es wurde kein Neuzeichnen angezeigt, nachdem ich das Caching eingeschaltet hatte ... also hoffentlich ist es in Ordnung. Danke noch einmal! –

1

Ich sehe Bedenken nicht in dem, was Sie beschrieben, aber ich glaube, Sie können mit Bitmap-Caching über.

Sagen Sie zum Beispiel, Sie hatten eine 500x500 "Top" Canvas, und es enthielt 25 'Sub' Canvases jede 100x100. Nehmen wir an, wir aktualisieren Inhalt/Farben usw. in jedem der Unter-Leinwände. Angenommen, es gibt ein Ereignis, das die oberste Leinwand auf dem Bildschirm verschieben würde. Wenn alle Unter-Canvases im selben Intervall geändert werden, wäre es sinnvoll, nur den oberen Canvas-Bereich mit Bitmap zu cachen. Wenn sich die Unter-Canvases jedoch nicht alle im selben Intervall oder manchmal überhaupt nicht ändern, kann es sich als vorteilhafter herausstellen, stattdessen das Bitmap-Caching auf jedem Unter-Canvas zu setzen. Gehen Sie noch einen Schritt weiter Wenn Sie sowohl die oberste als auch die untergeordnete Zeichenfläche im Bitmap-Format zwischenspeichern, kann es zu unnötigen Zyklen kommen, wenn Sie etwas ohne Nutzen cachen.

Oder gehe ich einen völlig anderen Weg als das, was Sie fragen?

+0

Das macht Sinn - danke. Wir machen keine eigene Animation, wir zeigen nur einige Telerik-Gitter. Ich bin mir nicht sicher, was sie tun - die Daten ändern sich nicht, aber wenn Redraw-Bereiche aktiviert sind, könnte ich den gesamten Bildschirm neu zeichnen sehen. Wie auch immer, ich habe das Problem der CPU-Auslastung gelöst, indem ich Bitmap-Caching nur für das Root-Element durchgeführt habe. –

+0

Dieses Video vom Silverlight Firestarter enthält auch einige gute Informationen zur Bitmap-Caching- und Rendering-Leistung: http://channel9.msdn.com/Series/Silverlight-Firestarter/Silverlight-Firestarter-2010-Session-6-Tune-Your-Application -Profiling-und-Performance-Tipps –

Verwandte Themen