Cela fait plusieurs jours que je recherche comment gérer le rafraichissement d'une fenetre OpenGL dans une Boite de dialogue MFC.
J'ai réussi avec des timers à rafraichir ma fenètre OpenGL, mais lorsque j'y ai intégré un compteur de FPS j'ai vu qu'elle ne tournait qu'à 60fps (en moyenne). Par contre, lorsque je passais la souris sur la fenetre, alors les fps passaient à 85. Ca aussi j'ai réussi à palier le problème en modifiant le corps de la fonction OnTimer().
Maintenant, ma fenetre OpenGL tourne tout le temps à 85fps et je cherche à la faire tourner à bien plus, pour pouvoir faire une sorte de bench perso pour voir l'efficacité de mes programmes. J'ai cherché pas mal sur le forum et j'ai vu que l'on pouvait désactiver la synchronisation verticale avec WGL_EXT_swap_control. Je l'ai implémenté mais ma fenetre OpenGL ne tourne toujours pas plus vite.
NB: En désactivant la V-Sync dans les drivers, la fenêtre tournait entre 3000 et 5000fps (ce que je recherche à faire, en gros).
Je ne comprends pas pourquoi cela ne marche pas : j'ai limpression que la MFC bloque le rafraichissement. Voici juste le code de la création de la fenetre OpenGL (juste au cas où).
Si quelqu'un arrivait à me dire où ça bloque... j'en peux plus de chercher et d'arriver à rien dès que j'entrevois une solution.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 int COpenGLControl::OnCreate(LPCREATESTRUCT lpCreateStruct) { char* extensions = NULL; if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; // Initial Setup: static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, // bit depth 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, // z-buffer depth 0, 0, 0, 0, 0, 0, 0, }; // Get device context only once. m_hdc = GetDC()->m_hDC; // Pixel format. m_nPixelFormat = ChoosePixelFormat(m_hdc, &pfd); SetPixelFormat(m_hdc, m_nPixelFormat, &pfd); // Setup the OpenGL Window's timer to render m_uipTimer = SetTimer(1, 1, NULL); // Create the OpenGL Rendering Context. m_hrc = wglCreateContext(m_hdc); wglMakeCurrent(m_hdc, m_hrc); SetCursor(LoadCursor(NULL, IDC_ARROW)); // Enable/Disable the vertical synchronization extensions = (char*)glGetString(GL_EXTENSIONS); if (strstr(extensions, "WGL_EXT_swap_control")) { //MessageBox(extensions); wglSwapInterval = reinterpret_cast<PFNWGLSWAPINTERVALEXT>(wglGetProcAddress("wglSwapIntervalEXT")); wglGetSwapInterval = reinterpret_cast<PFNWGLGETSWAPINTERVALEXT>(wglGetProcAddress("wglGetSwapIntervalEXT")); wglSwapInterval(1); //if (wglGetSwapInterval() > 0) MessageBox("Synchronisation Verticale activée"); } oglInitialize(); return 0; }
Partager