Laden...

Form kommt wegen Form_Paint ins straucheln (verschobene PictureBox hinterlässt weiße Stellen)

Erstellt von jansenpeter vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.711 Views
J
jansenpeter Themenstarter:in
38 Beiträge seit 2013
vor 9 Jahren
Form kommt wegen Form_Paint ins straucheln (verschobene PictureBox hinterlässt weiße Stellen)

Hi,

ich bin an einem kleinen 2D-Game dranne.

Meine Oberfläsche besteht aus Rectangles mit Images drin. Diese lasse ich mir per Form_Paint und e.Graphics zeichnen.

Sobald die Szene ungültig wird, was passiert wenn ich meinen "Player" rumbewege ruckelt die ganze Form. Was bei 20-30 Rectangles mit Images kein Wunder ist.

Ich habe das schon abgeschwächt indem ich nur einen Teil der Rectangles neu zeichnen lasse, es ruckelt aber trotzdem noch.

Meine Idee war es einen "Screenshot" von dem Hintergrund zu machen und den dann hinter die Szene zu legen, damit ich die Zeiten für das Zeichnen auf ein Minimum verringern kann. Wenn ich das allerdings mache und dann da drüber laufe, dann werden die Stellen an denen ich war gelaufen bin weiß, wie als würde ich drüber malen.

Weiß jemand ne Idee wie ich das anders machen kann?

  • Zensiert -
C
2.121 Beiträge seit 2010
vor 9 Jahren

Weiß jemand ne Idee wie ich das anders machen kann?

Das wird schwer, denn wir wissen ja nicht mal was du bisher machst.
Irgendwo wirst du mit weiß in dein Bild malen. Wenn du das überarbeitest hast du die Lösung.

J
jansenpeter Themenstarter:in
38 Beiträge seit 2013
vor 9 Jahren

Das "Level" lade ich mittels XML-Datei und Parser. Diese Grauen Boxen sind auch Teil davon, weshalb sie übermalt werden sobald ich die nicht neu zeichne. Darauf bewege ich ne Picturebox, mein Player.

Das neu Zeichnen kostet allerdings sehr viel Leistung, da das jede Sekunde ca. 10 mal passiert.

Ich will einen weg finden das nicht ganz so viel Leistung flöten geht.

  • Zensiert -
309 Beiträge seit 2008
vor 9 Jahren

Hmmm...

WinForms ist auch nicht für 2D Spiele gedacht. Wenn das performant werden soll wirst du um ein GameFramework (z.B. MonoGame) nicht herum kommen.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Scavanger,

nichts gegen die Verwendung anderer Grafik-Technologien, die natürlich ihre Berechtigung haben, doch einfache (2D)-Spiele lassen sich durchaus mit Windows Forms realisieren.

Hallo jansenpeter,

erstmal solltest du auch den Spieler zeichnen und keine PictureBox dafür verwenden. Siehe [Artikel] Zeichnen in Windows-Programmen für die Grundprinzipien, die es beim Zeichnen zu beachten gilt.

Um das Flackern zu vermeiden bzw. das Zeichnen zu beschleunigen gibt es verschiedene Ansätze, siehe [FAQ] Flackernde Controls vermeiden / Schnelles, flackerfreies Zeichnen (auch den verschiedenen Links folgen, nötigenfalls über mehrere Stufen).

Das konkrete Problem scheint mir im "hinter die Szene legen" zu liegen. Wenn du den Screenshot im OnPaint als erstes zeichnest, sollte es keine Probleme geben.

herbivore

J
jansenpeter Themenstarter:in
38 Beiträge seit 2013
vor 9 Jahren

Hi Herbivore,

Danke für die fixe und umfangreiche Antwort.

Hab ich auch schon bisschen in die Optimierungsthreads gelesen, allerdings ist mir gestern abend die Festplatte meines Laptops flöten gegangen ( Ich habe meinen Dickschädel, vor lauter Verzweiflung über das "gute" WLAN bei mir, auf den Laptop geballert.)

Backups hab ich zwar, die sind aber schon älter das System ist aber selbiges.

Ich werd die Threads mit meiner alten Version durchkauen und das ganze System neu schreiben.

Danke nochmal für die Entscheidungshilfe 😉

  • Zensiert -
J
jansenpeter Themenstarter:in
38 Beiträge seit 2013
vor 9 Jahren

Soo, kleines Update zu diesem Thema von mir. Was ich mir überlegt hatte zu dem Thema hat sehr gut funktioniert und ich hoffe das kann auch noch anderen helfen.

Und zwar hatte ich meine Form durch mehrere Arraylisten mit irgendeinem Kauderwelsch drinnen irgendwie zusammengeschustert.

Nun habe ich das alles vereinfacht und habe das alles auf ein Dictionary<int, Image> und eine List<Rectangle> reduziert. Dies gibt mir einen gewaltigen Performanceboost (welchen ich bitter nötig hatte).

Als zweite Änderung, verwende ich nun für meine Form die Eigenschaft "Double Buffered", was mir einen weiteren Boost verpasst.

Nun bin ich sehr zufrieden und habe den Fortschritt bereits genutzt, danke nochmal für den Beitrag von Herbivore der mich motivierte dran zu bleiben!

  • Zensiert -