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.