PeekMessage und GetMessage (horror)



  • ist ja auch ne gameloop, hab ich doch gesagt?

    Doch les mal was ich genau will! wenn das dingen minimiert ist braucht der mist trotzdem noch 100% Prozessor dank PeekMessage, obwohl das absolut nicht nötig ist. drum GetMessage + PeekMessage aber dieser elende schwachsinn will nicht! 😡



  • Irgendwi kam bei mir das WM_ACTIVATEAPP in der Anwendung nie an (obwohl es in Spy++ angezeigt wurde 😕 ) - deshalb hier mal eine Lösung mit IsIsonic:

    BOOL run    = TRUE;
    BOOL active = FALSE;
    
    while( run ) 
    { 
    	active = !IsIconic(hwnd);
    
    	if((active && PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )) || (!active && GetMessage (&msg, NULL, 0, 0))) 
    	{ 
    		TranslateMessage( &msg ); 
    		DispatchMessage( &msg );
    	}
    
    	if(active) {
    		// rendern
    	}
    
    	if( msg.message == WM_QUIT )
    	{
    		run = FALSE;
    	}
    }
    


  • sobald du GetMessage() drin hast, wartet deine anwendung auf eine nachricht -> extrem schlecht für die Performance.
    also ich würd GetMessage() nur während active == false is verwenden.

    bool run = true;    //Spiel läuft
    MSG msg;
    
    while( run )
    {
    
        while( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
        {
    
            if( msg.message == WM_QUIT )
            {
                run = false;
                break;
            }
    
            TranslateMessage( &msg );
            DispatchMessage( &msg );
    
        }
    
        //Rendern etc.
    
    }
    
    //Aufräumen
    

    soweit ich mich erinnern kann, verwendet Stefan Zerbst diese GameLoop.



  • Ach benutz PeekMessage und WaitMessage wenn die Anwendung minimiert ist!!



  • dot, sag mal hast du den knall nicht mitbekommen oder nicht gelesen?

    flenders hat doch die lösung schon gepostet, man bist du dämlich...



  • Was auch hilft ist ein Sleep(10) reinpacken. Das bringt bei mir die CPU Auslastung auf etwa 2% und die kommen nicht von meinem Prog.



  • Irgendwer schrieb:

    Was auch hilft ist ein Sleep(10) reinpacken. Das bringt bei mir die CPU Auslastung auf etwa 2% und die kommen nicht von meinem Prog.

    Ja toll, vor allem bei schnellen Renderszenen ist das sehr hilfreich lol

    MfG SideWinder



  • Irgendwer schrieb:

    Was auch hilft ist ein Sleep(10) reinpacken. Das bringt bei mir die CPU Auslastung auf etwa 2% und die kommen nicht von meinem Prog.

    Depp



  • @sidewinder: der hat wohl gemeint das Sleep(10) nur aktiv ist wenn das Programm minimiert ist... und nicht immer wie du vielleicht dachtest



  • Kannst du mal posten ob der Kram von Fenders jetzt funktioniert hat?

    Das der Kram mit WM_ACTIVATEAPP kann das auch nicht funktionieren. Ich würde einfach WM_ACTIVATE nehmen. Und ich würde den ganzen Kram auch ein bischen anders aufbauen:

    Erstmal eine globale Variable (z.B. bool acitve = true)

    while(run)
    {
      if(aktive)
      {
         if(GetMessage(...))
         {
          ...
         }
         else
           run = 0;
      }
      else
      {
         if(PeekMessage(...))
         {
          ...
         }
         else
           ...
      }
    }
    

    Jetzt musst du bei PeekMessage irgendwo noch run = 0 einbauen. In der Nachrichtenschleife verarbeitest du dann die Nachricht WM_ACTIVATE.

    Sie wird aufgerufen wenn die Anwendung aktiviert oder deaktiviert wird.


Anmelden zum Antworten