我正在主窗口中使用OpenGL制作Win32应用程序(不使用GLUT)。 我现在在WM_PAINT中有我的绘图代码,当我调用swapBuffers它必须使自己无效,因为它不断重新渲染并使用大量的cpu资源。如何在使用GDI时诚实地接收WM_PAINT时才能使其呈现?
由于
答案 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那么,我相信,问题就会消失。