SwapBuffers导致重绘

jma*_*erx 2 c c++ opengl winapi

我正在主窗口中制作带有OpenGL的Win32应用程序(不使用GLUT)。现在,当我调用swapBuffers时,我在WM_PAINT中有绘图代码,它必须使自身无效,因为它不断地重新渲染并使用大量的cpu资源。如何像在使用GDI一样诚实地收到WM_PAINT时才使它呈现?

谢谢

Chr*_*cke 5

在Windows验证窗口的脏区之前,将继续发送WM_PAINT消息。重置脏区的API是“ EndPaint”。

调用SwapBuffers根本不会影响无效的窗口区域。

您的WM_PAINT处理程序应类似于以下内容:

case WM_PAINT:
  HDC hdc;
  PAINTSTRUCT ps;
  hdc = BeginPaint(hwnd,&ps);
  wglMakeCurrent(hdc,scene.m_oglContext);
  scene.Render(); //
  wglSwapBuffers(hdc);
  wglMakeCurrent(hdc,0);
  EndPaint(hwnd,&ps);
  return 0;
Run Code Online (Sandbox Code Playgroud)

用于Open GL编程的许多示例代码在应用程序启动时都具有单个HDC和OpenGL上下文设置。尽管它使示例代码更简单,但这确实意味着该代码无法正确处理多个OpenGL上下文。此WM_PAINT处理程序假定为场景创建了OpenGL上下文,然后根据需要将其设为最新。

根据需要交换OpenGL上下文的副作用是,将从BeginPaint检索的hdc用作渲染(和SwapBuffer)目标,这意味着当其他窗口在应用程序窗口上拖动时,OpenGL应用程序现在将同步绘制。