2009-04-01 8 views
2

J'écris une application 3D pour Windows, en utilisant OpenGL. Pour l'instant, il rend une scène de test simple avec un modèle d'environ 50000 polygones et il rend en douceur à 60FPS. Cependant, le framerate devient très irrégulier chaque fois que la souris est déplacée sur la fenêtre de l'application. Il fluctue de 400 FPS à 20 FPS au hasard. Y a-t-il une raison quelconque pour cela? Cela est-il dû aux événements de souris que l'application est obligée de gérer? Puis-je les désactiver et juste interroger l'état de la souris?Framerate irrégulier à l'entrée de la souris dans l'application 3D

Ma boucle d'application est très simple, quelque chose de plus ou moins comme:

if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
{ 
    if (msg.message==WM_QUIT) 
    { 
    quit(); 
    } 
    else 
    { 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    } 
} 
else 
{ 
    draw(); 
    Sleep(1); 
} 

et la procédure de fenêtre est essentiellement

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

Répondre

0

Sonne comme un problème de fil. Qu'en est-il de l'utilisation d'une bibliothèque comme glut pour gérer la boucle principale opengl pour vous?

+0

Je ne peux pas, il doit utiliser WinAPI pur. – GhassanPL

1

En plus des messages de déplacement de souris, le déplacement sur une fenêtre génère des messages WM_SETCURSOR. Vous pouvez essayer d'ignorer ces messages et les messages WM_MOUSEMOVE pour voir si l'application accélère. Pour annuler, renvoyez 1 au lieu d'appeler DefWindowProc.

Il est impossible de désactiver les messages de la souris, mais les supprimer devrait être rapide. Vous pouvez utiliser GetCursorPos pour interroger les coordonnées de la souris.

+0

C'est la chose, je ne gère aucun message sauf WM_CLOSE. Renvoyer 0 ou 1 sur WM_MOUSEMOVE ne change rien. – GhassanPL

+0

Vous ne les manipulez peut-être pas, mais DefWindowProc l'est. –

0

Un peu dans le noir, mais le message WM_PAINT déclenchera-t-il le redessin de votre application? Si c'est là que vous effectuez le rendu, il semble que la souris génère InvalidateRects et force la fenêtre à se mettre à jour.

Généralement, je ne laisse pas les fenêtres interroger la souris, mais l'application elle-même interroge au besoin.

+0

Non, je ne gère pas le message WM_PAINT. – GhassanPL

+0

Comme tout le monde dit que DefWindowProc les gère. – thing2k

Questions connexes