gpt4 book ai didi

c++ - SwapBuffers 导致重绘

转载 作者:搜寻专家 更新时间:2023-10-31 00:22:52 25 4
gpt4 key购买 nike

我正在主窗口中使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com