c++ - SwapBuffers 导致重绘

标签 c++ c winapi opengl

我正在主窗口中使用 OpenGL 创建一个 Win32 应用程序(不使用 GLUT)。 我现在在 WM_PAINT 中有我的绘图代码,当我调用 swapBuffers 时,它必须使自己失效,因为它不断地重新渲染并使用大量的 cpu 资源。我怎样才能让它像使用 GDI 一样只在它真正收到 WM_PAINT 时才渲染?

谢谢

最佳答案

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)目标,这意味着如果其他窗口被拖动到应用的窗口。

关于c++ - SwapBuffers 导致重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2842319/

相关文章:

c++ - Scott Meyers 关于偏好非成员非友元方法的建议是否适用于对象构造?

c - recv() 的原型(prototype)

c - 如何解析 “invalid conversion from ' const char *' to ' LPSTR {aka char* }' [-fpermissive] "

c++ - 64 位 SendMessage API

c++ - 何时使用 sqlite3_blob_write/read?

c++ - const BYTE * 和 const LPBYTE

c - 子类化控件时如何处理控件的通知?比如EN_CHANGE?

c++ - 消除作为模板参数传递的重载成员函数指针的歧义

c++ - 在 C++ 中使用 USB 操纵杆

c++ - 任何在 64 位机器上使用 8 个字节作为 int 数据类型大小的 C/C++ 编译器