(一)需求
每当你创建一个three.js中的实例时,都会分配一定数量的内存。
因此,在项目中,会有很多加载资源比较大情况,为了提高性能,并避免应用程序中的内存泄露,因此需要废置未使用的类库实体。
然而,three.js会创建在渲染中所必需的特定对象, 例如几何体或材质,以及与WebGL相关的实体,例如buffers或着色器程序。
非常值得注意的是,这些对象并不会被自动释放;相反,应用程序必须使用特殊的API来释放这些资源。
(二)类别
名称 | 定义 | 如何实现 | 释放方法 |
---|---|---|---|
几何体 | 属性集合的顶点信息 | 为每个属性创建一个WebGLBuffer 类型的对象 | 调用BufferGeometry.dispose() |
材质 | 物体将如何被渲染,用来构造一个着色器程序 | 由于性能的原因,尽可能尝试复用已存在的着色器程序 | 着色器程序只有在相应材质被废置后才能被删除,执行Material.dispose() |
纹理 | 一个纹理可以同时被多个材质所使用 | 创建一个Texture 实例的时候,three.js在内部会创建一个WebGLTexture 实例 | 调用Texture.dispose() |
渲染目标 | WebGLRenderTarget类型的对象分配了多个对象 | WebGLTexture ,WebGLFramebuffer 和WebGLRenderbuffer | 执行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()什么时候合适,很大程度上取决于具体的用例。
没有必要总是废置对象。
比如,一个由多个关卡所组成的游戏。使用到对象废置的地方就是当切换关卡的时候。 应用程序可以通过较老的场景,并废置所有过时的材质、几何体和纹理贴图。
- 如果你废置一个仍然在使用的对象,并不会导致运行时错误。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。