Three.JS:纹理mipmaps和webGL参考

5

我有一个带有许多高质量纹理的模型,并尽力降低总内存使用量。 我尝试的其中一件事是,把mipmap从GPU中删除,以释放纹理数据从共同RAM中读取。这样做时,该模型仍然使用已上传的mipmaps纹理进行渲染。所以这很好,但内存根本不下降。

material.mipmaps.length = 0;

所以我的问题是:ThreeJS所保留的mipmaps是否有参考,垃圾收集器无法释放内存。还是纹理被webGL本身引用,这似乎有点奇怪,因为webGL让我想到纹理总是在专用内存中使用,因此必须复制。如果webGL在RAM中保留对原始纹理的引用,那么在具有独立图形卡和共享公共RAM的笔记本电脑上,webGL的行为是否会有所不同。如果有人能够解释一下ThreeJS/webGL中纹理引用的情况,我将非常高兴。
1个回答

1

这是一个很好的问题。

让我们下去看看...

通常情况下,当您想要将纹理从VRAM中清除时,您会使用dispose()。跟踪它所做的工作可能会给我们带来答案。那么dispose具体做了什么呢?

https://github.com/mrdoob/three.js/blob/2d59713328c421c3edfc3feda1b116af13140b94/src/textures/Texture.js#L103-L107

好的,所以它会触发一个事件。好的。那个事件在哪里处理?

https://github.com/mrdoob/three.js/blob/2d59713328c421c3edfc3feda1b116af13140b94/src/renderers/WebGLRenderer.js#L654-L665

啊哈,终于:

https://github.com/mrdoob/three.js/blob/2d59713328c421c3edfc3feda1b116af13140b94/src/renderers/WebGLRenderer.js#L834-L837

这意味着我们正在离开THREE.js,进入原始WebGL世界。在WebGL规范此处(3.7.1 / 3.7.2节)和一篇关于原始WebGL的教程此处此处中深入研究后,发现WebGL正在内存中保留引用,但这不是THREE.js纹理的公共属性。现在,为什么会进入RAM而不是VRAM,我不知道...您是否在具有专用或共享GPU RAM的计算机上进行了测试?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接