我的应用程序中的以下函数应该处理一个现有的场景环境,然后通过调用另一个自定义函数重新创建它。
function adjustAmbientLight(ambient_light) {
ambient_intensity = ambient_light;
const pmremGenerator = new THREE.PMREMGenerator(renderer);
if (scene.environment) {scene.environment.dispose()}
scene.environment = pmremGenerator.fromScene(new SetNewSceneEnvironment()).texture;
}
该函数完美地创建了新环境。
但是,当我通过将renderer.info.memory.textures记录到控制台进行测试时,我发现scene.environment.dispose()并没有消除相关的纹理。因此,最后一行代码会导致内存泄漏,因为它会在每次运行函数时创建并添加一个额外的纹理。
有没有人对如何正确处理环境纹理有什么建议?
发布于 2021-03-28 05:23:09
经过调查,我发现罪魁祸首是调用pmremGenerator.fromScene(env_scene)返回的WebGLRenderTarget
以前,我使用WebGLRenderTarget来获得一个用作环境贴图的纹理,之后我处理了这个纹理。然而,它并没有解决这个问题,因为WebGLRenderTarget在内部分配持久资源。
我需要保留对WebGLRenderTarget的引用,并显式地处理它以释放内部资源。
下面是我的最后一个环境地图创建函数,它可以正确地处理内部资源。
function SetNewSceneEnvironment() {
//create scene to be mapped
const env_scene = new THREE.Scene();
const roomMaterial = new THREE.MeshStandardMaterial( { side: THREE.BackSide, color: "white"} );
const room = new THREE.Mesh( new THREE.BoxGeometry(), roomMaterial );
room.position.set( 0, 0, 0 );
room.scale.set( 40, 40, 40 );
env_scene.add( room );
const env_alight = new THREE.AmbientLight(0xFFFFFF,Math.ceil(ambient_intensity*20)/10);
env_scene.add(env_alight);
//map the scene
const pmremGenerator = new THREE.PMREMGenerator(renderer);
const renderTarget = pmremGenerator.fromScene(env_scene)
const env_texture = renderTarget.texture;
//dispose of resources
room.geometry.dispose();
roomMaterial.dispose();
renderTarget.dispose();
pmremGenerator.dispose();
return env_texture;
}
https://stackoverflow.com/questions/66833916
复制相似问题