Autor Beitrag
Rolf1981
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 09.06.12 13:21 
Hallo zusammen,

ich arbeite seit einem halben Jahr an einem Projekt und habe hier schon mehrere wertvolle Tipps bekommen. Vielleicht hat mir auch dieses Mal jemand einen entscheidenden Hinweis.

Bei dem Projekt handelt es sich um ein Strategiespiel mit einer größeren Landkarte (10000 x 10000). Der Quellcode besteht im Grunde aus diesen Abschnitten

1. On Load
2. Timer 1(hier bewegen sich die Objekte und es finden alle Ereignisse statt, Intervall: 100)
3. Timer 2 (hier werden alle Ereignisse berechnet, die nicht so schnell aktualisiertw erden müssen, Intervall: 1000)
4. OnPaint-Ereignis (Objekte und der entspr. Teil der Landkarte werden gezeichnet)

Leider hatte ich Probleme damit, auf die Form direkt zu zeichnen. So reagierte z.B. das OnClick-Ereignis nicht mehr usw. Daher zeichne ich auf eine PictureBox. Ich weiß, dass das nicht ideal ist.

Nun treten sporadisch leider ziemliche Performance-Probleme auf. Merküwrdigerweise aber nur manchmal. Dies sieht dann so aus, dass man zuschauen kann, wie die Objekte nacheinander langsam gezeichnet werden. Nach ca. 1 Sekunde ist dann alles gezeichnet und es beginnt von vorne.
Wenn dies jedoch nicht auftritt, läuft alles wunderbar schnell und flüssig!

Es fällt mir gerade schwer, Quellcoe zu posten, da es sehr sehr umfangreich ist. Aber vielleicht hat trotzdem jemand einen Verdacht...

Danke schonmal!
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 09.06.12 13:55 
Stichwort Double Buffering: du zeichnest auf eine unsichtbare Bildflaeche (z.B. Bitmap), und wenn du damit fertig bist, diese Bildfläche auf das Formular bzw. die PictureBox. Dann sollte zumindest das flackernde Neuaufbauen verschwinden. Zur Performance: Schau mal in den Task-Manager, ob die CPUin den Zeiten mit schlechter Performance überdurchschnittlich hoch ausgelastet ist (vielleicht sogar durch ein anderes Programm?) Lasse dir auch die Zeit anzeigen, die die Timer-Routinen benötigen.

Eine bessere Grafikleistung würdest du auf jeden Fall durch OpenGL erhalten, z.B. mit dem Tao-Framework.

Grüsse,
Yogu
Rolf1981 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 09.06.12 17:45 
Hi,

danke für die Antwort!
DoubleBuffering ist bereits integriert, daran sollte es nicht liegen.
Die CPU-Auslastung liegt zwischen 20% und 40%, in beiden Fällen (wenn es flüssig läuft und wenn es Probleme gibt).

Wenn es einmal flüssig läuft, dann tut es dies auch die ganze Laufzeit über und zwar in jeder Situation und wirklich sehr flüssig! Wenn es jedoch nicht flüssig läuft, dann von Anfang an und die ganze Zeit über. Es hängt auch nicht von der Anzahl der Objekte etc. ab.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 10.06.12 22:53 
user profile iconRolf1981 hat folgendes geschrieben Zum zitierten Posting springen:
Dies sieht dann so aus, dass man zuschauen kann, wie die Objekte nacheinander langsam gezeichnet werden. Nach ca. 1 Sekunde ist dann alles gezeichnet und es beginnt von vorne.

Das hört sich aber gar nicht nach Double-Buffering an.

Hast du dir die Timer-Durchlaufzeiten mal angesehen?