OpenGL GPU Очистка памяти, требуется? - PullRequest
8 голосов
/ 07 февраля 2010

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

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

Ответы [ 5 ]

14 голосов
/ 15 февраля 2010

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

9 голосов
/ 07 февраля 2010

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

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

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

Теперь, если вы должны или нет, на самом деле это что-то вроде того, как спрашивать символы табуляции или пробелы в исходном коде. У разных людей здесь разные убеждения. «операционная система сделает это в любом случае, немедленное завершение работы - лучший опыт для конечного пользователя». vs «Я хочу знать, не теряю ли я память, потому что, если моя программа работает долго, я действительно не хочу, чтобы она вызывала ошибки OOM «Лучший способ сделать это - быть без утечек» - вот две основные мысли, которые мне известны.

1 голос
/ 07 февраля 2010

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

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

0 голосов
/ 21 июня 2013

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

Ex: В Android Opengl es2.0 использовал этот класс рендерера внутри метода drawframe (внутри метода draw) для рисования линий или окружностей и т. Д. Я использовал эту программу OpenGL ES2.0 в разработке приложений Android AutoCAD .. если вы хотите очистить заштрихованные линии, используйте этот метод в классе визуализации внутри метода onDrawframe GLES20.glClearColor (0,0f, 0,0f, 0,0f, 1,0f); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

0 голосов
/ 07 февраля 2010

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

...