Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Form kommt wegen Form_Paint ins straucheln (verschobene PictureBox hinterlässt weiße Stellen)
jansenpeter
myCSharp.de - Member



Dabei seit:
Beiträge: 38

Themenstarter:

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

beantworten | zitieren | melden

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?
Attachments
- Zensiert -
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.106

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
jansenpeter
myCSharp.de - Member



Dabei seit:
Beiträge: 38

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von jansenpeter am .
- Zensiert -
private Nachricht | Beiträge des Benutzers
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 309

beantworten | zitieren | melden

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));}}
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
jansenpeter
myCSharp.de - Member



Dabei seit:
Beiträge: 38

Themenstarter:

beantworten | zitieren | melden

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 -
private Nachricht | Beiträge des Benutzers
jansenpeter
myCSharp.de - Member



Dabei seit:
Beiträge: 38

Themenstarter:

beantworten | zitieren | melden

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 -
private Nachricht | Beiträge des Benutzers