我已经在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] 举报,一经查实,本站将立刻删除。