首页 > 解决方案 > 执行大量渲染任务时如何在 linux 上正确处理屏幕外 EGLContext?

问题描述

这是我的情况,我正在开发一个视频渲染引擎,该引擎在具有 Ubuntu 16.04 64 位操作系统的 GPU 云服务器上运行。

引擎监听用户请求,当它收到渲染请求时,它会启动一个线程,创建一个pbuffer EGLContext,使用opengl调用渲染视频帧,将帧编码为视频文件,然后销毁EGLContext。当接收到多个渲染请求时,渲染引擎将启动多个线程并并行运行多个任务。顺便说一句,我使用此nvidia 帖子中的代码设置和销毁EGLContext对象。 问题是,经过大量渲染任务后,渲染引擎在调用时会随机崩溃,nVidia卡和ATI卡都会发生这种情况。而且我不知道是因为我在处理方面做错了什么,还是只是 Linux EGL 驱动程序的错误。
eglCreateContextEGLContext

因此,我没有EGLContext为每个渲染任务创建一个,而是重用以前创建EGLConext的 ,并确保在每个渲染任务结束时删除所有 OpenGL 资源。
但是,我发现即使我已经删除了所有的OpenGL资源(我检查并再次检查),渲染任务完成后内存使用量也不会下降到初始水平。只有在我销毁 之后EGLContext,内存才会下降到它的初始水平。

现在,对于第一种方法,你们有没有遇到过这样的崩溃问题?来自nvidia post的代码是正确的处理方式EGLContext吗?或者我应该在快速创建和破坏方面做一些不同的事情EGLContext
对于第二种方法,我从一些帖子中了解到,您调用了那些 OpenGL api 来删除您的资源,并强制使用 GPU 同步glFinishEGLContext可能仍将它们放在缓冲区中。我认为这就是如果我重用“EGLContext”,每次渲染任务后内存使用量都会下降的原因。但是有没有办法立即删除这些资源?

标签: linuxubuntuopenglgpuegl

解决方案


我们最终为每个渲染任务创建了一个新进程,一切都很好!感谢@datenwolf!


推荐阅读