Three.JS:纹理mipmap和webGL的参考

Mar*_*her 5 memory textures three.js

我有一个具有大量高质量纹理的模型,我努力保持整体内存使用率下降.我尝试过的一件事是在将mipmap推到GPU后删除它们,以便从公共RAM中重新获取纹理数据.这样做时,模型仍然使用一次上传的mipmaps纹理进行渲染.这很好,但内存根本没有下降.

material.mipmaps.length = 0;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

是否有对ThreeJS保留的mipmap的引用,即garbace收集器无法释放内存.或者是webGL本身引用的纹理,这似乎有点奇怪,因为webGL让我觉得纹理总是在专用内存中使用,因此必须复制.如果webGL在RAM中保留对原始纹理的引用,那么webGL在具有专用图形卡的台式机和具有共享公共RAM的板载图形卡的笔记本电脑上的行为会有所不同.

如果有人可以解释我在threeJS/webGL内部进行纹理参考的话会非常高兴.

gee*_*aut 1

这是个好问题。

我们去那里吧...

因此,通常dispose()当您希望将纹理从 VRAM 中踢出时,您会需要它。追踪它的作用可能会给我们带来答案。那么dispose有什么作用呢?

https://github.com/mrdoob/ Three.js/blob/2d59713328c421c3e​​dfc3feda1b116af13140b94/src/textures/Texture.js#L103-L107

好的,它会分派一个事件。好吧。哪里处理的?

https://github.com/mrdoob/ Three.js/blob/2d59713328c421c3e​​dfc3feda1b116af13140b94/src/renderers/WebGLRenderer.js#L654-L665

啊哈,最后:

https://github.com/mrdoob/ Three.js/blob/2d59713328c421c3e​​dfc3feda1b116af13140b94/src/renderers/WebGLRenderer.js#L834-L837

这表明我们将离开 THREE.js 并进入原始 WebGL 的世界。深入研究一下这里的WebGL 规范(第 3.7.1 / 3.7.2 节)以及这里这里的原始 WebGL 教程,显示 WebGL 在内存中保留引用,但这不是 THREE.js 的公共属性质地。

现在,为什么它进入 RAM 而不是 VRAM,我不知道......您是否在具有专用或共享 GPU RAM 的计算机上测试过它?