微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

wglMakeCurrent在工作线程中泄漏内存吗?

我已经在MS Windows下用OpenGL编写了服务器端的离线渲染。 该工作stream程由以下步骤组成:

客户端发送一个卷呈现请求。

服务器收到请求,请求一个工作线程通过请求中包含的参数进行一些射线投射。

服务器检索渲染的图像,将其发送到客户端并终止工作线程。

使用OpenGL而不使用X-Window系统

如何安装当前版本的OpenGL for Windows C ++?

如何使用QT,OpenGL,C ++和Linux更改屏幕分辨率?

asynchronous纹理加载的设备

如何开始使用OpenGL和C ++开发,我需要在Windows上安装什么工具

它起初工作正常。 但是,在10000次请求之后,wglMakeCurrent()将会失败,并且可以检测到重大的内存泄漏。 所以我做了一个简单的testing程序,其中只包含OpenGL上下文的创build和删除。 如下所示。 wglMakeCurrent()在大约10,000次循环后总是失败。 有人可以告诉我,如果代码有什么问题吗? 我使用NVIDIA Quadro GPU,驱动版本是307.45,操作系统是Windows 7 64位。

#include <cstdio> #include <windows.h> #include <tchar.h> #include <process.h> LRESULT CALLBACK WndProc_GL(HWND handle,UINT message,WParaM w_param,LParaM l_param) { return DefWindowProc(handle,message,w_param,l_param); }//------------------------------------------------------- unsigned int __stdcall OpenglThreadProc(void *ptr_input) { HINSTANCE inst_handle = GetModuleHandle(NULL); WNDCLASS wnd_class = {CS_HREDRAW | CS_VREDRAW | CS_OWNDC,(WNDPROC)WndProc_GL,inst_handle,NULL,_T("OpenGL Hidden Window Class") }; if (!RegisterClass(&wnd_class)) return 0; HWND window_handle = CreateWindow(_T("OpenGL Hidden Window Class"),_T("Window For OpenGL"),WS_OVERLAPPEDWINDOW|WS_CLIPSIBLINGS|WS_CLIPCHILDRE N,256,NULL); if (!window_handle) return 0; HDC dc_handle = GetDC(window_handle); PIXELFORMATDESCRIPTOR ogl_pfd = {sizeof(PIXELFORMATDESCRIPTOR),1,PFD_SUPPORT_OPENGL,PFD_TYPE_RGBA,32,24,8,PFD_MAIN_PLANE,0 }; int pixel_format = ChoosePixelFormat(dc_handle,&ogl_pfd); if (!SetPixelFormat(dc_handle,pixel_format,&ogl_pfd)) return 0; HglrC rc_handle = wglCreateContext(dc_handle); if (!rc_handle || !wglMakeCurrent(dc_handle,rc_handle)) return 0; _tprintf_s(_T("Executing Thread %d.n"),*(reinterpret_cast<int*>(ptr_input)) + 1); // Deletes OpenGL context and destroys window. wglMakeCurrent(NULL,NULL); wglDeleteContext(rc_handle); ReleaseDC(window_handle,dc_handle); DestroyWindow(window_handle); UnregisterClass(_T("OpenGL Hidden Window Class"),GetModuleHandle(NULL)); return 1; }//-------- int main (const int argc,TCHAR *argv[]) { int i = 0; for (; i < 20000; i++) { HANDLE running_thread = reinterpret_cast<HANDLE>(_beginthreadex(NULL,OpenglThreadProc,&i,NULL)); WaitForSingleObject(running_thread,INFINITE); CloseHandle(running_thread); } return 1; }//---------

我发现这个testing程序有些混乱。 wglMakeCurrent()每次调用时都会创build一个Windows用户对象,但是该对象不会在wglDeleteContext()中释放。 即使在工作人员终止后,它仍然存在,导致内存泄漏。 Windows下的用户对象有每个进程的限制,所以程序最终会失败。

当上下文创build/删除代码移动到主线程时,wglMakeCurrent()在第一次调用后不会创build新的用户对象。 所以似乎wglMakeCurrent()只在新线程中创build新的用户对象。 但是,由于OpenGL上下文被显式删除,并且线程被终止,所以与该上下文相关的资源也应该被释放。 我不知道这是我的代码或驱动程序的错误。 有人可以帮我吗?

如何在ANSI C中使用glDrawVertex()函数

/ usr / bin / ld:找不到-lGL(Ubuntu 16.04)

没有X服务器的OpenGL直接到Linux的framebuffer

gluT跟踪按下的按键(当按下SHIFT键并释放按键时)

弃用的OpenGLfunction

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐