Требуется очистка памяти OpenGL GPU?

должен ли я очищать все DisplayLists, текстуры, (Geometry-)шейдеры и так далее вручную с помощью функций glDelete*, или GPU mem освобождается автоматически, когда моя программа выходит/аварийно завершает работу?

Примечание: GPU mem относится к выделенной памяти на выделенной видеокарте, а не памяти процессора.

5 ответов


освободите контекст, все остальное локально для контекста (если вы не включили общий доступ к списку отображения) и уйдет вместе с ним.


Как уже упоминалось, ваша ОС (в сотрудничестве с диспетчером ресурсов драйвера) должна освободить ресурсы. Для этого и существуют Осы. Стоит отметить, что это не имеет ничего общего с OpenGL, но является частью устава хорошо себя ведут ОС и связанных с ними драйверов. ОС существует для обработки все системные ресурсы. OpenGL-это всего лишь их подмножество, и они ничем не отличаются, скажем, от дескриптора файла. Теперь, чтобы получить более конкретные, вы следует указать, какая ОС вас интересует.

кстати, здесь я хотел бы возразить против ответа ChrisF по. Это не должно быть до водителя, чтобы решить, что он должен сделать очистку. Модели драйверов ОС будут иметь четкий интерфейс между драйвером OpenGL пользовательского режима (который не должен выполнять фактическое распределение ресурсов gfx, поскольку он совместно используется в машине), ОС (которая обеспечивает эквивалент системных вызовов для распределения ресурсов) и драйвером режима ядра (который просто существует для выполнения ОС заказы таким образом, который совместим с gpu). Это, по крайней мере, относится к моделям WIN2K и WDDM.

Так... если процесс аварийно завершается или завершается иным образом, в этих моделях ответственность за вызов драйвера режима ядра для освобождения всех ресурсов, связанных с процессом, возлагается на ОС.

теперь, если вы должны или нет-это действительно что-то вроде запроса вкладок или пробелов в исходном коде. У разных людей разные убеждения здесь. "ОС сделает это в любом случае, выход немедленно-лучший опыт конечного пользователя" vs "я хочу знать, протекает ли память, потому что, если моя программа работает долго, я действительно не хочу, чтобы она попадала в ошибки OOM. Лучший способ сделать это-быть свободным от утечки" - это 2 основных направления мысли, о которых я знаю.


когда ваша программа выходит (или аварийно завершает работу), то любая выделенная память должна быть освобождена в конечном итоге так же, как обычно освобождается основная память при выходе программы. Может пройти некоторое время, прежде чем GPU "осознает", что память снова доступна для использования.

однако вы не должны полагаться на это поведение, поскольку оно может зависеть от того, как были реализованы драйверы видеокарты. Гораздо лучше сделать явные вызовы очистки, когда вы (как программист) знаете, что не нужна эта память.


все ваши ресурсы GPU будут освобождены, когда ваша программа выйдет. Простой способ проверить-не удалять вещи и повторно запускать приложение, чтобы проверить, не завершается ли выделение после нескольких итераций.


в Opengl нет памяти для хранения информации о чертеже. здесь, когда мы выполняем программу opengl, это время вызывает метод draw frame, вызывающий последовательно. В любом случае, если мы рисуем линию или круг, в любое время его вызывающий метод draw frame для рисования в указанном месте.но opengl не хранит эту строку в памяти. В любое время, только его рисунок. но, когда мы увидели, что линия успешно засияла.

Ex: В Android Opengl es2.0 используется этот класс визуализации внутри метод drawframe (внутри метода draw)для рисования линий или кругов и т. д.. я использовал этот Opengl es2.0 программа в разработке приложений Android autocad.. если вы хотите очистить рассветные линии, используйте этот метод в классе renderer внутри метода onDrawframe GLES20.glClearColor (0.0 f, 0.0 f, 0.0 f, 1.0 f); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT / GLES20.GL_DEPTH_BUFFER_BIT);