Day 266/300 ThreeJs 如何废置对象?
创始人
2024-01-29 16:27:27
0

(一)需求

每当你创建一个three.js中的实例时,都会分配一定数量的内存。
因此,在项目中,会有很多加载资源比较大情况,为了提高性能,并避免应用程序中的内存泄露,因此需要废置未使用的类库实体。

然而,three.js会创建在渲染中所必需的特定对象, 例如几何体或材质,以及与WebGL相关的实体,例如buffers或着色器程序。

非常值得注意的是,这些对象并不会被自动释放;相反,应用程序必须使用特殊的API来释放这些资源。

(二)类别

名称定义如何实现释放方法
几何体属性集合的顶点信息为每个属性创建一个WebGLBuffer类型的对象调用BufferGeometry.dispose()
材质物体将如何被渲染,用来构造一个着色器程序由于性能的原因,尽可能尝试复用已存在的着色器程序着色器程序只有在相应材质被废置后才能被删除,执行Material.dispose()
纹理一个纹理可以同时被多个材质所使用创建一个Texture实例的时候,three.js在内部会创建一个WebGLTexture实例调用Texture.dispose()
渲染目标WebGLRenderTarget类型的对象分配了多个对象WebGLTextureWebGLFramebufferWebGLRenderbuffer 执行WebGLRenderTarget.dispose()
杂项examples目录的类如控制器或者后期处理过程dispose()

(三)常见问题

1、为何three.js不能够自动废置对象?

  • three.js并不知道用户所创建的实体(例如几何体或者材质)的生命周期或作用范围,这些是应用程序的责任。
  • 比如说,即使一个材质当前没有被用于渲染,但它也可能是下一帧所必需的。

将一个mesh(网格)从场景中移除,是否也会废置它的geometry(几何体)和material(材质)?
并不会,你必须通过dispose()来明确地废置geometry(几何体)或material(材质)。

  • 请记住,geometry(几何体)或material(材质)可以在3D物体之间(例如mesh(网格))被共享。

2、three.js是否会提供被缓存对象数量的相关信息?

可以的,WebGLRenderer.info —— 渲染器中的一个特殊属性

  • 具有一系列关于显存和渲染过程的统计信息。
  • 有多少纹理、几何体和着色器程序在内部存储。

3、我如何知道什么时候该废置事物?

调用dispose()什么时候合适,很大程度上取决于具体的用例。

  • 没有必要总是废置对象。

比如,一个由多个关卡所组成的游戏。使用到对象废置的地方就是当切换关卡的时候。 应用程序可以通过较老的场景,并废置所有过时的材质、几何体和纹理贴图。

  • 如果你废置一个仍然在使用的对象,并不会导致运行时错误。

参考链接

https://threejs.org/docs/#manual/zh/introduction/How-to-dispose-of-objects

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...