Собираются ли объекты WebGL? - PullRequest
2 голосов
/ 22 октября 2019

В памяти JavaScript, которую я выделил (например, ArrayBuffer), освобождается, когда у меня больше нет ссылок на него со стороны GC, как я понял, верно?

Объекты WebGL, такие как Buffers или Textures,связанный с блоком памяти в графическом процессоре, как выделено gl.bufferData() или gl.textureImage2D().

Мне интересно: если я оставлю свою последнюю ссылку на объект WebGLTexture или WebGLBuffer, получит ли он мусор сблок памяти GPU, автоматически освобожденный виртуальной машиной JavaScript?

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Да


С spec

Обратите внимание, что базовый объект GL будет автоматически помечен для удаления при уничтожении объекта JS


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

1 голос
/ 22 октября 2019

Скопировано из этого ответа: Собирается ли мусор WebGLTextures?

со словом WebGLTexture, замененным на WebGLObject


Да и нет.

Да, они мусор. Но сборка мусора происходит всякий раз, когда браузер решает собрать их. Судя по POV большинства JavaScript-движков браузера, объект WebGLObject представляет собой крошечный объект, который просто содержит int, поэтому у него нет простого способа узнать о каком-либо особом давлении для его сбора. Другими словами, когда у GPU заканчивается память, сборщик мусора JavaScript, который не имеет связи с GPU, не может знать, что ему нужно освободить эти крошечные WebGLObject объекты, чтобы освободить память текстур. Он только смотрит на память процессора.

На самом деле это хорошо известная проблема сбора мусора. Это здорово для памяти. Это не так хорошо для других ресурсов.

Так что, да, WebGLObject объекты собирают мусор, и да, текстура / буфер / renderbuffer / program / shader будет освобождена, но практически вам нужно удалить их самостоятельно, еслиВы не хотите исчерпывать память.

Конечно, браузер освободит их всех, если вы обновите страницу или посетите новую страницу в той же вкладке, но вы не можете рассчитывать на браузер мусорасобирать WebGLObject объекты (текстуры / буферы / рендер-буферы / программы / шейдеры) любым полезным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...