linux - 执行大量渲染任务时如何在 linux 上正确处理屏幕外 EGLContext?
问题描述
这是我的情况,我正在开发一个视频渲染引擎,该引擎在具有 Ubuntu 16.04 64 位操作系统的 GPU 云服务器上运行。
引擎监听用户请求,当它收到渲染请求时,它会启动一个线程,创建一个pbuffer EGLContext
,使用opengl调用渲染视频帧,将帧编码为视频文件,然后销毁EGLContext。当接收到多个渲染请求时,渲染引擎将启动多个线程并并行运行多个任务。顺便说一句,我使用此nvidia 帖子中的代码设置和销毁EGLContext
对象。
问题是,经过大量渲染任务后,渲染引擎在调用时会随机崩溃,nVidia卡和ATI卡都会发生这种情况。而且我不知道是因为我在处理方面做错了什么,还是只是 Linux EGL 驱动程序的错误。eglCreateContext
EGLContext
因此,我没有EGLContext
为每个渲染任务创建一个,而是重用以前创建EGLConext
的 ,并确保在每个渲染任务结束时删除所有 OpenGL 资源。
但是,我发现即使我已经删除了所有的OpenGL资源(我检查并再次检查),渲染任务完成后内存使用量也不会下降到初始水平。只有在我销毁 之后EGLContext
,内存才会下降到它的初始水平。
现在,对于第一种方法,你们有没有遇到过这样的崩溃问题?来自nvidia post的代码是正确的处理方式EGLContext
吗?或者我应该在快速创建和破坏方面做一些不同的事情EGLContext
。
对于第二种方法,我从一些帖子中了解到,您调用了那些 OpenGL api 来删除您的资源,并强制使用 GPU 同步glFinish
,EGLContext
可能仍将它们放在缓冲区中。我认为这就是如果我重用“EGLContext”,每次渲染任务后内存使用量都会下降的原因。但是有没有办法立即删除这些资源?
解决方案
我们最终为每个渲染任务创建了一个新进程,一切都很好!感谢@datenwolf!
推荐阅读
- django - DRF 仅获取列表视图的第一个序列化实例?
- c - 双指针作为C中的参数
- c# - 防止 iText7 中的换行文本重叠
- python - 从数据框索引中删除国家组
- ssh - VSCode v1.43 远程 ssh 无法连接。v1.42 作品
- android - 在Android.mk中,如何将一个目录下的所有文件递归复制到out/vendor/目录下
- android - 在 Android 的 Crashlytics 报告中获取 KeyStore.aliases() 上的 NullPointerException
- maven - 在 Ejb 项目中,来自 src/main/java 的 java 类看不到来自 src/test/java 的类
- python - 从数据集 Python 中获取缺失的日期时间 - 数据系列
- javascript - 网络说 Dom 内容已加载。Console.log 不记录到开发者控制台。调试器没有命中。未调用函数