Geschwindigkeitsoptimierung GDI



  • 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 😉





  • 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 eingestellt
    

    Timer? 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.





  • 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 klauen
    

    Wie 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
    }
    

Anmelden zum Antworten