Geschwindigkeitsoptimierung GDI
-
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.
-
So ist eine Spielenachrichtenschleife IMHO am elegantesten gelöst:
while(1){ if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){ // müssen irgendwo Nachrichten verarbeitet werden? if(msg.message==WM_QUIT)break; TranslateMessage(&msg); DispatchMessage(&msg); } else{ // keine Nachrichten in den Warteschlangen // hier kannst du jetzt machen was du willst, ohne // anderen Prozessen die Prozessor-Resourcen zu klauen // z.B. den nächsten Frame berechnen und anzeigen // ... // dein Code hier // } }Falls du dort BitBlt aufrufen solltest, empfehle ich dir danach auch GdiFlash aufzurufen, da BitBlt sonst evtl. gepuffert wird und das Programm so ins stocken kommen kann.
-
// hier kannst du jetzt machen was du willst, ohne // anderen Prozessen die Prozessor-Resourcen zu klauenWie meinst du diesen Kommentar? So kriegst du eine Prozessorauslastung von 100%. ABER das ist auch okay so. So arbeiten fast alle Spiele. Auf jeden Fall die Fullscreen stattfinden.
-
Ja, du kriegst die ganze Prozessorzeit, die nicht gebraucht wird, wenn alle anderen Programme zusammen 10% brauchen, kriegst du die restlichen 90, wenn irgendein Programm plötzlich mehr braucht, bekommst du eben ein bischen weniger, in der Summe ergibt es immer 100%. Auf die Art können noch andere Programme im Hintergrund laufen, dessen Ausführung von deinem Programm nicht beeinträchtigt wird (wie es i.A. gewollt ist) und dein Programm (Spiel) läuft mir maximaler Performance (Framerate).
-
Merci für die Hilfe
Musste jedoch die Schleife ein bisschen nach meinen Bedürfnissen abändern, da ich sonst nicht schnell genug die Tastaturnachrichten abarbeiten konnte.
Das folgende hat sehr gut geholfen
while(msg.message!=WM_QUIT) { while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } // my nice code }