PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C# .NET, effizient scrollen?


Jesus
2006-01-30, 14:10:41
Hallo,

habe folgendes Problem:

Ich möchte eine Bitmap scrollen. Das tu ich auch, allerdings verursacht das immer 100% CPU Load.

Ich habe einen Timer (10ms) in dem ganz einfach x=x+1; this.Invalidate() gemacht wird um die Paint() Methode aufzurufen. Leider verursacht das übelst CPU Last.

Kann man das irgendwie effizienter (aber mit GDI+) machen?

mfg,
JEsus

grakaman
2006-01-30, 21:39:36
Hallo,

habe folgendes Problem:

Ich möchte eine Bitmap scrollen. Das tu ich auch, allerdings verursacht das immer 100% CPU Load.

Ich habe einen Timer (10ms) in dem ganz einfach x=x+1; this.Invalidate() gemacht wird um die Paint() Methode aufzurufen. Leider verursacht das übelst CPU Last.

Kann man das irgendwie effizienter (aber mit GDI+) machen?

mfg,
JEsus

Das hängt ja erst mal davon ab, wie stark dein Prozessor ist. Ich hatte ja im anderen Thread erwähnt, dass ich diesbezüglich eine Testapp mit den Win32 Scrollfunktionen erstellt hatte. Wenn ich damit nun z.B. 15 MDI Forms simultan scrolle, habe ich eine Auslastung von ca. 20-26%. Die Forms sind jeweils 333; 149 groß und die darauf befindliche PictureBox inkl. Bild 376; 448. Hier mal ein Screenshot:

http://img399.imageshack.us/img399/2536/mdi0lj.jpg

Vielleicht gibt dir das ja einen Anhaltspunkt.

edit:

ist allerdings auch auf einen X2 4400+ mit 2GB Ram getestet

Metzler
2006-01-31, 00:22:31
Hm, wie groß ist die Bitmap? Wenn du wirklich alle 10ms neu zeichnest, sind das 100 Frames. Wundert mich nicht, wenn die CPU dann am Anschlag ist.
Ich weiß zwar nicht, was du zeichnest, aber du könntest noch den Bereich, der neu gezeichnet wird, in der Größe einschränken.

Jesus
2006-01-31, 09:23:05
Hm, wie groß ist die Bitmap? Wenn du wirklich alle 10ms neu zeichnest, sind das 100 Frames. Wundert mich nicht, wenn die CPU dann am Anschlag ist.
Ich weiß zwar nicht, was du zeichnest, aber du könntest noch den Bereich, der neu gezeichnet wird, in der Größe einschränken.

Hm ich zeichen in der Paint() immer die komplette Bitmap. Ist etwa 800x600. Der Prozzi ist ein Centrino 1.5Ghz, sollte reichen und ich zeichne immer 2 solche Bitmaps gleichzeitig (in zwei MDI forms die je ihren eigenen "Scrolltimer" haben) und mache immer 10er Schritte bei den X und Y Koordinaten, damits etwas schneller ist.

/EDIT:

Habe den Timer jetzt auf 55ms geändert. Damit hab ich so 45-50% Auslastung, allerdings siehts auch nicht besonders flüssig aus. Das muss man doch schöner hinbekommen? (Habe bei der verwendeten Form double-buffering aktiviert)

Metzler
2006-01-31, 13:00:45
Ich hatte vor kurzem eine Anwendung (ebenfalls C#, .NET), bei der es im max. Fall 40 FPS die Sekunde geben musste und das ganze Auflösungsabhängig, sprich auf meinem Laptop mit 1440*1050 Pixel. Das Update war schon intelligent insofern, dass ich nur den notwendigen Teil neu gezeichnet habe und trotzdem war die Anwendung, zumindest mit 40 Frames auf dem Laptop kaum realisierbar...

Jesus
2006-01-31, 20:02:45
Naja es ist jetz erträglicher...

In der Paint mache ich übrigens folgendes:

e.Graphics.DrawImage(bmp,new Point(xoffset+movex,yoffset+movey));

Wobei ich im Timer dann nur den offset ändere. Ist das gut oder schlecht?

zeckensack
2006-01-31, 20:20:17
Naja es ist jetz erträglicher...

In der Paint mache ich übrigens folgendes:

e.Graphics.DrawImage(bmp,new Point(xoffset+movex,yoffset+movey));

Wobei ich im Timer dann nur den offset ändere. Ist das gut oder schlecht?Halte ich für gut.

Ich kenne mich mit .NET nicht aus, aber zeichnest du evtl zu viel neu?
<...>
this.Invalidate()
<...>... zeichnet IMO das gesamte "Objekt" neu, und ich gehe jetzt einfach mal frech davon aus dass es sich dabei um das komplette MDI-Fenster handelt.

Windows unterscheidet bei Fenstern (grob) zwischen "Client Area" und "Non-client area". ZB (MDI-)Fenstertitel und -Rahmen musst du ja nicht immer wieder neu zeichnen (beides ist "non-client"). Scrollbalken, falls vorhanden (ebenfalls "non-client") schon :|
Wie gesagt, keine Ahnung wie man das in .NET realisiert, aber je nach Theme könnte das IMO noch einen spürbaren Performancegewinn bringen.

Jesus
2006-01-31, 21:05:42
Halte ich für gut.

Ich kenne mich mit .NET nicht aus, aber zeichnest du evtl zu viel neu?



Ehm, keine Ahnung, ich zeichne wohl immer die Bitmap neu, allerdings ändere ich deren inhalt nicht, sondern nur die position an der sie gezeichnet wird.


... zeichnet IMO das gesamte "Objekt" neu, und ich gehe jetzt einfach mal frech davon aus dass es sich dabei um das komplette MDI-Fenster handelt.

Sorry war mein Fehler, eigentlich mach ich picBox.Invalidate() (hab ne picBox in der Form.