Laden...

Kleine Simulationen laufen lassen, in der Bildinhalte hinzukommen wird schnell "ruckelig"

Erstellt von ByteDevil vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.205 Views
ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 5 Jahren
Kleine Simulationen laufen lassen, in der Bildinhalte hinzukommen wird schnell "ruckelig"

Hi,

ich suche nun schon einige Zeit nach etwas geeignetem, allerdings bin ich mir nicht so ganz sicher wonach ich suchen muss. Ich möchte kleinere grafische Simulationen laufen lassen wo immer mal wieder gewisse Bildinhalte dazu kommen. Weiß aber nicht wie ich das Ganze performant hinbekomme.

Bisher zeichne ich immer so:

Ich leite mir eine Klasse von Canvas ab und überschreibe die OnRender() Methode. Darin zeichne ich dann meine Objekte. Nun möchte ich zB alle 100 ms alle meine Objekte zeichnen. Allerdings kommen ständig neue hinzu. Daher muss ich ja alle Objekte in einer Liste haben und ALLE alle 100 ms zeichnen...das wird natürlich recht schnell ruckelig und ich frage mich ob es nicht eine möglichkeit gibt immer nur das zu zeichnen was neu hinzugekommen ist. Geht das mit C#/WPF?

Mann könnte an ein Doppelpendel denken welches sich über längere Zeit bewegt und immer eine Spur auf dem Bildschirm ziehen soll. Müsste mir ja sonst sämtliche Punkte zu jedem Zeitpunkt t merken und sie bei jedem Aufruf von OnRender alle zeichnen...

T
2.219 Beiträge seit 2008
vor 5 Jahren

Klingt etwas merkwürdig.
Die Frage wäre auch, ob es nötig ist alle Objekte immer wieder alle 100ms zu zeichnen.
Wenn sich an den Bildern selbst nichts ändert, also nur durch neue Bilder die dann das Gesamtbild überlappen würden, dann würde ich nur neuzeichnen.
Alle 100ms dann X Grafiken zu zeichnen, wäre unntiger Overhead.

Noch sinnvoller wäre es aber sich immer nur eine Grafik zu generieren und die Änderungen, also neue Objekte darauf zu zeichnen.
Sonst hast du irgendwann auch das Problem, dass du eine schier endlose Liste durchlaufen musst nur um ein Bild zu zeichnen und dann kommst du irgendwann nicht mehr mit deinen 100ms hin.
Entsprechend sollten deine neuen Objekte immer auf eine Gesamtgrafik gezeichnet und das Bild dann zwischen gespeichert werden.
Oder wäre dies nicht machbar?

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 5 Jahren

Hallo T-Virus 😃

Ja ich zeichne alles alle 100ms um es visualisieren zu können. Du hast recht - es zu Zeichnen wenn es fertig ist wäre sonst natürlich die eigentliche vorgehensweise. Entschuldige, das hätte ich wohl dazu sagen sollen. Also ich möchte sehen können wie das Bild entsteht.

Dieses Phyllotaxis (Anhang) ist zB so etwas. Mache sowas gern weil ich das interessant finde und stunden lang zusehen könnte wie solche Gebilde nach und nach entstehen 😃 Da speichere ich halt jeden berechneten Punkt in einer Liste und zeichne ihn dann alle 100ms. Dabei entstehe dieses Sprialenmuster von innen nach aussen.

Ja an das mit der Grafik habe ich auch schon gedacht...kam mir aber irgendwie hingepfuscht vor und meinst du das würde flüssig aussehen?

16.807 Beiträge seit 2008
vor 5 Jahren

Grafik ist nicht mein Bereich; aber glaube nicht, dass WinForms hierfür das geeignete ist.
Ich meine aber, dass solche Simulationen bei Unity-Einsteiger-Samples Verwendung finden.

5.657 Beiträge seit 2006
vor 5 Jahren

Ich leite mir eine Klasse von Canvas ab und überschreibe die OnRender() Methode.

Abgesehen davon, daß man die Canvas-Klasse einfach verwendet, und nicht davon ableitet, ist das für solche Zwecke das falsche Mittel. Die Canvas ist darauf optimiert, Objekte darzustellen, die mittels DataBinding festgelegt werden.

Wenn du effizient eine Bitmap zeichnen willst, gibt es dafür die WritableBitmap-Klasse.

Weeks of programming can save you hours of planning

T
2.219 Beiträge seit 2008
vor 5 Jahren

@MrSparkle
Dank, kann ich auch noch nicht.
Bin auch davon ausgegangen, dass man Canvas zum generellen zeichnen verwendet.
Leider habe ich noch nie per Code in WinForms selbst was gezeichnet, weshalb ich da nicht bewandert bin.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

5.657 Beiträge seit 2006
vor 5 Jahren

Stimmt, aber es ging um WPF, auch wenn man das schnell überlesen kann:

Geht das mit C#/WPF?

Weeks of programming can save you hours of planning

T
2.219 Beiträge seit 2008
vor 5 Jahren

Hatte ich verwechselt, da ich nur im Namespace System.Window gelesen hatte.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.