Вот моя ситуация: я работаю над механизмом рендеринга видео, который работает на облачных серверах GPU с 64-битной ОС Ubuntu 16.04.
Движок слушает запросы пользователя, когда он получает запрос на рендеринг, он запускает поток, создает pbuffer EGLContext
, рендерит видеокадры с помощью вызовов opengl, кодирует кадры в видеофайл, а затем уничтожает EGLContext. При получении нескольких запросов на рендеринг механизм рендеринга запускает несколько потоков и выполняет несколько задач параллельно. Кстати, я установил и уничтожил EGLContext
объект, используя код из этого nvidia post.
Дело в том, что после большого количества задач рендеринга движок рендеринга будет случайным образом падать при вызове eglCreateContext
, это происходит как для карт nVidia, так и для карт ATI. И я не знаю, это потому, что я делаю что-то неправильно с обработкой EGLContext
, или это просто ошибка с драйвером Linux EGL.
Таким образом, вместо того, чтобы создавать EGLContext
для каждой задачи рендеринга, я повторно использую ранее созданный EGLConext
и просто для того, чтобы удалить все ресурсы OpenGL в конце каждой задачи рендеринга.
Но я обнаружил, что даже я удалил все Ресурсы OpenGL (я проверял и проверял еще раз), использование памяти не упадет до исходного уровня после завершения задачи рендеринга. Только после того, как я уничтожу EGLContext
, память сбросит свой начальный уровень.
Теперь, что касается первого метода, ребята, вы когда-нибудь сталкивались с такой проблемой сбоев? Является ли код из сообщения nvidia правильным способом обработки EGLContext
? Или я должен сделать что-то другое, когда дело доходит до быстрого создания и уничтожения EGLContext
.
Что касается второго метода, я узнал из некоторых сообщений, что событие, которое вы вызвали, эти API OpenGL для удаления ваших ресурсов и заставили синхронизировать GPU с помощью glFinish
, EGLContext
может все еще иметь их в буфере. И я думаю, что это причина, по которой использование памяти падает после каждой задачи рендеринга, если я повторно использую «EGLContext». Но есть ли способ немедленно удалить эти ресурсы?