如何在 linux 执行大量渲染任务时正确处理屏幕外 EGLContext?
How to handle offscreen EGLContext properly on linux when doing massive rendering task?
这是我的情况,我正在开发 运行 在具有 Ubuntu 16.04 64 位 OS 的 GPU 云服务器上的视频渲染引擎。
引擎监听用户请求,当它收到渲染请求时,它会启动一个线程,创建一个pbuffer EGLContext
,使用opengl调用渲染视频帧,将帧编码为视频文件,然后销毁 EGLContext。当接收到多个渲染请求时,渲染引擎将启动多个线程并运行 并行执行多个任务。顺便说一句,我使用 nvidia post.
中的代码设置并销毁了 EGLContext
对象
问题是,在大量渲染任务之后,渲染引擎在调用 eglCreateContext
时会随机崩溃,nVidia 卡和 ATI 卡都会发生这种情况。我不知道是因为我在 EGLContext
处理上做错了什么,还是只是 Linux EGL 驱动程序的错误。
因此,我没有为每个渲染任务创建 EGLContext
,而是重复使用之前创建的 EGLConext
,只是为了确保在每个渲染任务结束时删除所有 OpenGL 资源。
但是,我发现即使我删除了所有的OpenGL资源(我检查了又检查了一遍),渲染任务完成后内存使用率不会下降到初始水平。只有在我摧毁 EGLContext
之后,内存才会下降到它的初始水平。
现在第一种方法,你们遇到过这样的闪退问题吗?来自 nvidia post 的代码是处理 EGLContext
的正确方法吗?或者我应该在快速创建和销毁 EGLContext
时做些不同的事情。
对于第二种方法,我从一些 post 中了解到你调用了那些 OpenGL api 来删除你的资源,并使用 glFinish
强制 GPU 同步,EGLContext
可能仍然有它们缓冲区。我认为这就是如果我重用 'EGLContext',那么在每次渲染任务后内存使用量都会下降的原因。但是有没有办法立即删除这些资源?
我们最终为每个渲染任务创建了一个新进程,一切都很好!感谢@datenwolf!
这是我的情况,我正在开发 运行 在具有 Ubuntu 16.04 64 位 OS 的 GPU 云服务器上的视频渲染引擎。
引擎监听用户请求,当它收到渲染请求时,它会启动一个线程,创建一个pbuffer EGLContext
,使用opengl调用渲染视频帧,将帧编码为视频文件,然后销毁 EGLContext。当接收到多个渲染请求时,渲染引擎将启动多个线程并运行 并行执行多个任务。顺便说一句,我使用 nvidia post.
中的代码设置并销毁了 EGLContext
对象
问题是,在大量渲染任务之后,渲染引擎在调用 eglCreateContext
时会随机崩溃,nVidia 卡和 ATI 卡都会发生这种情况。我不知道是因为我在 EGLContext
处理上做错了什么,还是只是 Linux EGL 驱动程序的错误。
因此,我没有为每个渲染任务创建 EGLContext
,而是重复使用之前创建的 EGLConext
,只是为了确保在每个渲染任务结束时删除所有 OpenGL 资源。
但是,我发现即使我删除了所有的OpenGL资源(我检查了又检查了一遍),渲染任务完成后内存使用率不会下降到初始水平。只有在我摧毁 EGLContext
之后,内存才会下降到它的初始水平。
现在第一种方法,你们遇到过这样的闪退问题吗?来自 nvidia post 的代码是处理 EGLContext
的正确方法吗?或者我应该在快速创建和销毁 EGLContext
时做些不同的事情。
对于第二种方法,我从一些 post 中了解到你调用了那些 OpenGL api 来删除你的资源,并使用 glFinish
强制 GPU 同步,EGLContext
可能仍然有它们缓冲区。我认为这就是如果我重用 'EGLContext',那么在每次渲染任务后内存使用量都会下降的原因。但是有没有办法立即删除这些资源?
我们最终为每个渲染任务创建了一个新进程,一切都很好!感谢@datenwolf!