做大量渲染任务时,如何在Linux上正确处理屏幕外EGLContext?

时间:2019-01-16 15:11:30

标签: linux ubuntu opengl gpu egl

在这种情况下,我正在开发一个视频渲染引擎,该引擎可在具有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的代码是否发布了处理EGLContext的正确方法?或者在快速创建和销毁EGLContext时应该做些不同的事情。
对于第二种方法,我从一些帖子中学到了一些事件,即您调用了OpenGL api来删除资源,并强制使用glFinish进行GPU同步,EGLContext可能仍将它们保留在缓冲区中。我认为这就是如果我重用“ EGLContext”后每次渲染任务后内存使用率确实下降的原因。但是有办法立即删除那些资源吗?

1 个答案:

答案 0 :(得分:0)

我们最终为每个渲染任务创建了一个新的过程,并且一切正常!感谢@datenwolf!