windows - Framerate ujævn på mus input i 3D app

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver en 3D-applikation til Windows ved hjælp af OpenGL. For øjeblikket er det en simpel testscene med en model på ca. 50000 polygoner, og det gør det smidigt ved 60FPS.


Men frameratet bliver meget ujævnt, når musen flyttes over applikationsvinduet. Det svinger fra 400 FPS til 20 FPS tilfældigt. Er der nogen grund til dette? Er dette forårsaget af musehændelser, er appen tvunget til at håndtere? Kan jeg deaktivere dem og bare undersøge musestatus?


Min app-loop er meget enkel, noget mere eller mindre som:


if (PeekMessage(&msg,NULL,0,0,PM\_REMOVE))
{
  if (msg.message==WM\_QUIT)
  {
    quit();
  }
  else
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
}
else
{
  draw();
  Sleep(1);
}


og vinduet proceduren er grundlæggende


return DefWindowProc(hWnd,uMsg,wParam,lParam);

Bedste reference


Udover musebevægelsesmeddelelserne vil der blive genereret WM\_SETCURSOR meddelelser under flytning over et vindue. Du kan prøve at afskrive dem og WM\_MOUSEMOVE meddelelserne for at se, om appen er hurtigere. For at kassere skal du returnere 1 i stedet for at ringe til DefWindowProc.


Der er ingen måde at slukke for musemeddelelserne, men det skal være hurtigt at kaste dem væk. Du kan bruge GetCursorPos til at afstemme musekoordinaterne. [3]

Andre referencer 1


Det lyder som et trådproblem. Hvad med at bruge et bibliotek som glut til at håndtere open-loop-sløjfen til dig? [4]

Andre referencer 2


Lidt et skud i mørket, men vil WM\_PAINT-meddelelsen udløse din app for at omdanne? Hvis det er her, hvor gengivelsen sker, så lyder det som om musen genererer InvalidateRects og tvinger vinduet til at opdatere.


Generelt lader jeg mig ikke om, at vinduerne poller musen overhovedet, men selve appen afstemninger efter behov.