2010-02-06 3 views
8

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

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

+0

Зависит от вашего определения «обязательно». Вы не должны «ничего делать». Если вы хотите быть «правильным», да; вы должны всегда выпускать свои ресурсы, когда закончите. – GManNickG

+0

Я скорее хотел узнать, будет ли он автоматически очищаться, * вскоре * после закрытия Программы или если память GPU будет потеряна до следующей перезагрузки. Я надеялся, что кто-то может указать мне на спецификацию OpenGL, и там было определено (хотя моя любимая поисковая система не плюнула мне что-нибудь полезное). – drahnr

+0

Оба! Действительно, очистите себя, даже если ОС сделает это за вас. Вам также не нужно «удалять» любую «новую» память, ОС просто освободит ее, когда программа закончится, но все же это не то, что я предлагаю. –

ответ

13

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

+0

Не могли бы вы помочь, если wglDeleteContext не выпустит всю память? – SOUser

+0

@SOUser: Вы разрешили совместное использование ресурсов между контекстами? Затем ресурсы будут освобождены при удалении последнего связанного контекста. Если у вас есть доказательства того, что удаление контекста не очищается, сообщите об ошибке с помощью драйвера графического процессора. –

1

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

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

1

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

8

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

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

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

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

+0

Я думаю, что получил «почему» .. thx для вашего ответа – drahnr

+0

Обратите внимание, что вы противоречите себе. Да, ОС отправляет событие драйверу, когда требуется очистка ... но он по-прежнему является драйвером, который выполняет фактическую работу, а отказ при очистке - это ошибка неисправного драйвера. –

+0

@BenVoigt: попытался прояснить, что я имел в виду. Это лучше? – Bahbar

-1

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

Ex: В Android Opengl es2.0 используется этот класс рендеринга внутри метода drawframe (внутри метода draw draw), чтобы нарисовать линии или круги и т. Д. Я использовал эту программу Opengl es2.0 в разработке приложений для Android-андроида .. , если вы хотите очистить рассветные линии, используйте этот метод в классе renderer внутри метода 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

Ну, конечно, он не хранит какую-либо нарисованную геометрию, но хранит целую кучу других вещей, как в памяти процессора, так и в графическом процессоре. Лучший пример, где эта линия обращена и почему вы можете ее увидеть? –

+0

Привет, Кристиан Рау, ты прав. Я сказал только о хранении памяти GPU. Я столкнулся с проблемой для вышеупомянутого. см. эту ссылку и, если возможно, помогите мне в этой борьбе. http://stackoverflow.com/questions/17187032/why-my-opengl-output-differs-for-various-devices См. этот пример кода также по этой ссылке http://tuxbalaji.wordpress.com/2013/06/ 19/втягивания-Line-используя-opengles2-0-на-контакт-событие-в-андроид / – harikrishnan

Смежные вопросы