Ich habe ein WPF-Steuerelement erstellt (erbt von FrameworkElement), das eine gekachelte Grafik anzeigt, die geschwenkt werden kann. Jede Kachel ist 256 x 256 Pixel bei 24 bpp. Ich habe OnRender überschrieben. Dort lade ich neue Kacheln (als BitmapFrame) und zeichne dann alle sichtbaren Kacheln mit drawingContext.DrawImage.WPF-Renderleistung mit BitmapSource
Jetzt, wenn es mehr als eine Handvoll neue Kacheln pro Renderzyklus gibt, fällt die Framerate für etwa eine Sekunde von 60 fps auf Null. Dies wird nicht durch das Laden der Bilder verursacht (was in der Größenordnung von Millisekunden liegt), noch durch DrawImage (das braucht überhaupt keine Zeit, da es nur einige Zwischen-Render-Datenstrukturen füllt).
Meine Vermutung ist, dass der Render-Thread selbst erstickt, wenn er eine große Anzahl (~ 20) neuer BitmapSource-Instanzen erhält (also solche, die er nicht bereits zwischengespeichert hatte). Entweder wird viel Zeit für die Konvertierung in ein internes DirectX-kompatibles Format benötigt oder es wird ein Caching-Problem verursacht. Es kann nicht aus dem Video-RAM gehen; Perforator zeigt Peaks bei unter 60 MB, ich habe 256 MB. Perforator sagt außerdem, dass alle Renderziele hardwarebeschleunigt sind, also kann es auch nicht sein.
Alle Einblicke würden geschätzt werden!
Vielen Dank im Voraus
Daniel
@RandomEngy:
BitmapScalingMode.LowQuality das Problem ein wenig verringert, aber nicht von ihr bekam befreien. Ich lade bereits Kacheln mit der gewünschten Auflösung ein. Und es kann nicht der Grafiktreiber sein, der aktuell ist (Nvidia).
Ich bin ein wenig überrascht zu erfahren, dass die Skalierung so lange dauert. So wie ich es verstanden habe, wird eine Bitmap (unabhängig von ihrer Größe) einfach als Direct3D-Textur geladen und dann hardware-skaliert. Sobald die Bitmap zum ersten Mal gerendert wurde, kann ich ihre Rotation und Skalierung ohne weitere Einfrierungen ändern.