Laden...

Byte Array als Bitmap darstellen mit 60 Fps

Erstellt von Prefetch vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.193 Views
P
Prefetch Themenstarter:in
4 Beiträge seit 2020
vor 3 Jahren
Byte Array als Bitmap darstellen mit 60 Fps

Hallo,

ich bin noch ganz neu in C# und möchte für mein erstes Projekt ein Software Renderer portieren, den ich schon in einer anderen Sprache angefangen hatte. Dieser Software Renderer schreibt alle Ausgaben in ein ByteArray mit RGB Werten, also 3 Bytes entsprechen ein Pixel auf dem Bildschirm später. Nun zu meiner Frage:

Wie würdet ihr dieses ByteArray visualisieren mit WPF, so dass automatisch alle 1/60 Sekunden das ByteArray als Bitmap neu dargestellt wird?

16.827 Beiträge seit 2008
vor 3 Jahren

In WPF sind UI und Render-Thread entkoppelt; d.h. dass Du evtl. 60 FPS+ rendern kannst; aber das nicht zwangsläufig im UI Thread ankommt.

WPF selbst ist keine Engine, die auf Frameraten optimiert ist; WPF verfolgt das Prinzip, dass nur Elemente gerendert werden, wenn es notwendig ist.
Anders als zB bei Spiele-Engines ist ein kostantes Rendern nicht vorgesehen; sogar unmöglich. WPF basiert vollständig auf auf dynamischen Framerates.

Da wirst Du vermutlich an die Grenzen von WPF stoßen.

37 Beiträge seit 2014
vor 3 Jahren

Grundsätzlich verhält es sich so, wie Abt schon schreibt. WPF und RealTime-Rendering ist eine ganz eigene Geschichte.

Wenn du es trotzdem probieren willst:

  • WriteableBitmap ist dein Freund
  • Je höher die Auflösung, desto eher bekommst du FrameDrops rein

Besser als mit WriteableBitmap ist es mit Direct3D Interop - aber auch deutlich komplizierter. Und auch hier kommst du früher oder später an die von Abt beschriebenen grenzen.

P
Prefetch Themenstarter:in
4 Beiträge seit 2020
vor 3 Jahren

Danke euch schonmal für eure Antworten. Ich hatte meine Sachen vor langer Zeit auch mal nach Java portiert. Dort war JavaFX mein Freund. Leider is der Souce weg, aber man konnte ein Timer für die Szene oder so einstellen und dieser hat dann eine Funktion aufgerufen in der ich die Konvertierung vom Array zum Bitmap vorgenommen hatte.

Mein Vorhaben dient nur dem Lernen, ich bin da also nicht auf absolute Performance aus, oder darauf dass da wirklich synchron zum Monitor was passieren muss.

16.827 Beiträge seit 2008
vor 3 Jahren

Sehr vereinfachte Darstellung:

Spiele-Engines funktionieren so, dass eine Endlosschleife läuft und anhand von Informationen dann Dinge gerendet werden - egal ob es eine Änderung gab oder nicht.

WPF funktioniert genau anders rum: WPF überwacht Quellen und reagiert auf die Änderung.
Bei einer Änderung werden diese als "dirty" markiert und WPF wird getriggert um neu zu rendern.

Du müsstest also ständig die Quellen ändern, sodass WPF zum rendern animiert wird.
Eine UI-Aktualisierungsgarantie gibts aber nicht. Aber das hat eben Grenzen.
WPF ist für so ein Szenario kaum ausgelegt.

Oder dann eben die Tipps von Roland_K, die quasi die Grenzen etwas weiter nach hinten verschieben.

P
Prefetch Themenstarter:in
4 Beiträge seit 2020
vor 3 Jahren

Denke auch, dass dann vielleicht ein Timer dafür sorgt dass ein Bereich zum Updating gezwungen wird. C# und WPF ist ja noch völlig neu für mich, daher ist jetzt erstmal Recherche angesagt.

16.827 Beiträge seit 2008
vor 3 Jahren

Man nennt sowas Reaktive Programmierung

In .NET ist sowas nicht eingebaut, aber es gibt Reactive Extensions for .NET.

Siehe auch 101 Rx Samples in C#.
In Deinem Fall vermutlich Time Related Operators.

P
Prefetch Themenstarter:in
4 Beiträge seit 2020
vor 3 Jahren

Besten Dank, jetzt kümmere ich mich als erstes um das WriteableBitmap und wenn das geht sehe ich zu dass das alle 1/60 Sekunden sich neu aufbaut. Dein Link wird da sicherlich hilfreich sein, danke dafür.