Autor Beitrag
Bruegge
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 16.06.09 21:24 
Hi ich habe ein kleines problem... ich arbeite gerade an einem kleinen 2d rpg, das aus einer kleinen welt besteht.
wenn der spieler sich bewegt, soll die ganze welt verschoben werden... (das ist nicht mein problem... ;) )
ich lasse natürlich nur den teil der welt anzeigen, der in sichtweite ist.
meine kleine welt besteht aus kleinen 128*128 pixel tiles bei einer auflösung von 1024*768 also werden immer 8*6 tiles gezeichnet. trotzdem ist mein spiel laggy, wieso?

also ich habe eine form mit einer picturebox und einer bitmap.
ich lasse alles mit hilfe von Graphics.creategraphic in die bitmap zeichnen.
wenn alles soweit ist, nehme ich die bitmap und lege sie auf die picturebox (damit das nicht flackert)
ein timer mit 30ms soll das bild neu zeichnen. aber das zeichnen der 48 bilder dauert zu lange und es ruckelt.

muss ich eine 2d engine nutzen, damit das zeichnen schneller geht oder so?
wenn ja welche und wie binde ich sie ein?
oder habt ihr da noch bessere ideen?

danke für jede antwort!!


MFG bruegge
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 17.06.09 09:30 
Slang verstehe ich nicht. Ist "laggy" so etwas wie langsam?

Das ist natürlich kein Wunder: Wenn du alle 30 ms - also 30x pro Sekunde - 48 Bilder neu zeichnen willst, dann wird das System zwangsläufig enorm belastet. Mein Hauptvorschlag wäre, die Struktur zu überdenken, sodass weniger neu gezeichnet werden muss.

Aber mit Graphics habe ich mich fast überhaupt nicht beschäftigt; deshalb kann ich außer der allgemeinen Erklärung keine wirklichen Vorschläge bringen. Tut mir leid! Jürgen
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 17.06.09 10:14 
Einen guten Artikel zum Zeichnen gibt es unter www.mycsharp.de/wbb2...d.php?threadid=21782.
Bzgl. flackerfreies Zeichnen s.a. www.mycsharp.de/wbb2...d.php?threadid=59980

Evtl. solltest du aber auf XNA umsteigen (denn die GDI(+) ist nun mal keine schnelle Grafikschnittstelle).
FabianClassen
Hält's aus hier
Beiträge: 11

WIN XP
Java (JEdit, NetBeans), C#(VS 2008 Express)
BeitragVerfasst: Mi 17.06.09 12:33 
Ich würde dir SDL.net empfehlen.
Ich weiß zwar nicht, wie gut die Simple Directmedia Layer unter .net und C# realisiert worden ist,
aber ich kann an sich SDL nur empfehlen. Hab mich mal mit C++ ein bisschen damit auseinander gesetzt.

SDL.net hat den großen Vorteil gegenüber XNA, dass man nicht so ein riesen Framework mitschleppen muss.
Die benötigten Bibliotheken sind um einiges kleiner als die des XNA.

MFG
Fab
;)

PS:
www.libsdl.org/
cs-sdl.sourceforge.net/index.php/Main_Page
Bruegge Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 17.06.09 17:57 
Hi vielen dank für die posts!!! ihr habt mir echt weitergeholfen!!! es läuft jetzt flüssig und gut danke!
Bruegge Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 17.06.09 20:05 
hey also ich habe mit die zeit gemessen:

zum zeichnen braucht der 0,006 sec
zum position berechnen und server senden 0,00003 sec
zum serverinformationen erhalten 0,005 sec

ich habe das jetzt wie folgt gemacht:

ich habe einen thread position berechnen:
dieser thread erhält die informationen vom server und errechnet die eigene position insg max 0,009 sec
dieser thread ist in einer while(true) schleife...
mit thread.sleep(30).

immer wenn alles errechnet ist soll er jetzt zeichnen:
das zeichnen hab ich natürlich im paint event ^^

allerdings weiß ich nicht wie ich das paintevent vom thread aus aufrufen kann

mit pictureboxname.invalidate() passiert nichts
mit pictureboxname.update() kommt ein error:

Cross-thread operation not valid: Control 'pictureboxname' accessed from a thread other than the thread it was created on.


wie kann ich das jetzt umgehen?

vielen lieben dank!!!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 18.06.09 09:55 
Control.Invoke ist dafür das richtige Stichwort, s.a. www.mycsharp.de/wbb2...d.php?threadid=33113