我有一个模型,其中包含许多高质量的纹理,并且我努力降低总体内存使用率。我尝试的一件事是在将mipmap推送到GPU之后将其删除,以从公共(public)RAM导出纹理数据。这样做时,仍将使用曾经上传的mipmap纹理渲染模型。这样就可以了,但是内 stub 本不会下降。
material.mipmaps.length = 0;
所以我的问题是:
是否有对ThreeJS保留的mipmap的引用,即垃圾收集器无法释放内存。还是由webGL本身引用的纹理,这似乎有点奇怪,因为webGL让我认为纹理始终用于专用内存中,因此必须将其复制。如果webGL在RAM中保留对原始纹理的引用,则webGL在具有专用图形卡的台式机和具有共享公共(public)RAM的板载图形卡的笔记本电脑上的行为会有所不同。
如果有人可以向我解释threeJS/webGL中用于纹理引用的内容,我将非常高兴。
最佳答案
这是个好问题。
我们去那里...
因此,通常,当您希望将纹理从VRAM中踢出时,您会对其进行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规范here(第3.7.1节/3.7.2节)以及有关原始WebGL here和here的教程,可以发现WebGL在内存中保留了引用,但这不是THREE.js的公共(public)属性。质地。
现在,为什么要进入RAM而不是我不知道的VRAM?您是否在具有专用或共享GPU RAM的计算机上进行了测试?
关于memory - Three.JS:纹理mipmap和webGL的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24171957/