Geschwindigkeitsoptimierung GDI



  • 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