SwapBuffers导致重绘

时间:2010-05-16 01:43:57

标签: c++ c winapi opengl

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

由于

2 个答案:

答案 0 :(得分:5)

WM_PAINT消息继续发送,直到Windows验证了窗口的脏区域。重置脏区域的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;

Open GL编程的大量示例代码在应用程序启动时具有单个HDC和OpenGL上下文设置。虽然它使示例代码更简单,但它确实意味着代码无法正确处理多个OpenGL上下文。此WM_PAINT处理程序假定为场景创建OpenGL上下文,然后根据需要使其成为当前。

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

答案 1 :(得分:1)

我怀疑你没有从WM_PAINT处理程序返回0。这意味着WM_PAINTs不断生成。如果你返回0那么,我相信,问题就会消失。