Geschwindigkeitsoptimierung GDI
-
Hallo Leutz
Habe einige animierte Bewegungen mit der GDI erstellt Und habe eine Probleme mit der Geschwindigkeit. Mir ist durchaus bekannt, dass diese Möglichkeit nicht zu den schnellsten gehört, aber ich kann ja schlecht wegen jedem bisschen gleich mit DirectX anfangen. Schließlich ist ja nicht jedes Spiel auf dieser Welt in DirectX erstellt worden.
Lade alle Bitmaps bereits in der WM_CREATE. Klassenzugriffe die nur Werte zurückgeben sind bei mir schon als "inline". Gibt es weitere Optimierungsmöglichkeiten?> Bitte keine Verweiße auf DirectX, dafür ist es nicht umfangreich genug

-
double buffering
http://www.c-plusplus.net/forum/viewtopic.php?t=14713
-
DoubleBuffering ist bereits schon geschehen.
Mein Bild läuft supe flimmerfrei, aber die CPU-Auslastung liegt bei 100%
daraus folgt, das es ab und zu stockt
-
Kann man sich dein Programm inklusive Source-Code mal anschauen?
-
BasicMan01 schrieb:
DoubleBuffering ist bereits schon geschehen.
Mein Bild läuft supe flimmerfrei, aber die CPU-Auslastung liegt bei 100%
daraus folgt, das es ab und zu stocktgenau das problem hab ich auch
http://www.c-plusplus.net/forum/viewtopic.php?p=730421
-
Also 100 % CPU Auslastung hat ja nichts zu sagen. Kommt doch drauf an wie ihr eure Nachrichtenschleife programmiert.
-
100% schrieb:
Also 100 % CPU Auslastung hat ja nichts zu sagen. Kommt doch drauf an wie ihr eure Nachrichtenschleife programmiert.
die habe ich so programmiert, dass sie auch, bei geringer auslastung, wenig cpu-auslastung zeiht. (mit sleep() und sowas)
-
joomoo schrieb:
100% schrieb:
Also 100 % CPU Auslastung hat ja nichts zu sagen. Kommt doch drauf an wie ihr eure Nachrichtenschleife programmiert.
die habe ich so programmiert, dass sie auch, bei geringer auslastung, wenig cpu-auslastung zeiht. (mit sleep() und sowas)
das hört sich ja schonmal scheisse an
-
Mich wundert, das WinXP die GDI-Funktionen nicht rüber nach DirectDraw wrapped.
Außerdem scheint mir WS_EX_COMPOSITED (quasi WinXP eigenes Double-Buffering) recht lahmarschig zu sein
-
vielleicht kannste damit was erreichen:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdraw_8ed0.asp
und:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdraw_0enc.asp
-
Die beiden betroffenen sollten ihren Code zeigen. Vielleicht machen sie ja irgendwo große Fehler und es liegt überhaupt nicht an der Geschwindigkeit von GDI.
-
*G* Mir schon klar, dass hier einige den Code gerne sehen würden, aber erstens sind 1000 Zeilen plus x - Header unangebracht, hier zu drucken und zweitens stellt nicht jeder gerne den Code von größeren Projekten gerne zur Verfügung. Aber wen es hilft, hier einige kleine Daten.
Timer auf 10 Millisekunden eingestellt --> also etwa 99 -100 Bilder pro Sekunde
Rechner 2,4 Ghz 99 Bilder Optimaler Bildaufbau bei 0-1% CPU-Auslastung
Rechner 1,6 GhZ 55 Bilder ruckelt bei 100% CPU-Auslastung
Rechner 0,8 Ghz 24 Bilder ""Problem liegt definitiv an meinem Zeichnen, denn die Schleife dauert etwas 133 millisekunden. Hab das mit dem PerformansCounter gemessen.
-
@BasicMan01,
machst du wirklich nur Zeichenoperationen (BitBlt usw) in deiner Schleife? Wenn du jedesmal z.B. GetDC, GetSysColor usw. aufrufst, könnte das deinen Rechner in die Knie zwingen.
-
Timer auf 10 Millisekunden eingestelltTimer? Welchen Timer und warum einen Timer?
-
@ROFL., ich nehme mal an: SetTimer. Warum sollte man auch keinen Timer verwenden? Wenn du ohne Timer arbeitest, hast du letztendlich das gleiche Problem wie alte DOS-Spiele die du auf modernen Rechnern ausführen willst.
-
Also wenn man schon Timer benutzt dann bitte Multimedia Timer oder sowas. Die Timer die man mit SetTimer erzeugt sind nicht für Spiele geeignet.
-
Wenn du ohne Timer arbeitest, hast du letztendlich das gleiche Problem wie alte DOS-Spiele die du auf modernen Rechnern ausführen willst.
Das löst man anders.
-
@ROFL., wie denn? Kenne mich in dem Gebiet nicht besonder aus, daher frage ich.
-
Das ist das Fachgebiet der Spieleprogrammierer

http://www.c-plusplus.net/forum/viewtopic-var-t-is-39430-and-start-is-0.html
-
OK, ich habe mir mal die Seite reingezogen.
An sich ist das alles ja super.
Eine Frage habe ich aber dazu. Wo muss ich das in meinem Programm hinzufügen, wenn das WM_TIMER Ereignis dann nicht mehr existiert.
Es muss ja eine Schleife sein, die sich ständig wiederholt. Da fällt mir im Moment nur die hier ein:while( GetMessage(&msg, NULL, 0, 0) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }
-
ich würd' sowas mit multithreading machen. z.b. ein thread mit höchster priorität der freiwillig rechenzeit abgibt (mit 'Sleep()') könnte den bildaufbau übernehmen. die freie rechenzeit käme dem rest des programms zu gute.