WebGLProperties 比较简单,不需要mini 版,我们直接看其源码。
csharp
function WebGLProperties() {
let properties = new WeakMap();
function has( object ) {
return properties.has( object );
}
function get( object ) {
let map = properties.get( object );
if ( map === undefined ) {
map = {};
properties.set( object, map );
}
return map;
}
function remove( object ) {
properties.delete( object );
}
function update( object, key, value ) {
properties.get( object )[ key ] = value;
}
function dispose() {
properties = new WeakMap();
}
return {
has: has,
get: get,
remove: remove,
update: update,
dispose: dispose
};
}
export { WebGLProperties };
WebGLProperties 是WebGLRenderer 的轻量级"附属属性仓库",扮演 「运行时侧车缓存(sidecar cache)」的角色。
WebGLProperties 通过WeakMap 对象,把与 WebGL 相关的运行时数据与Three.js 对象(Material、Texture、RenderTarget 等)相绑定,避免污染这些对象本身的 API。
WebGLProperties 方法说明
has(object)
判断某个对象是否已有属性记录。
php
function has( object ) {
return properties.has( object );
}
get(object)(最常用)
以object 为键从properties 中获取值;
若不存在则自动创建 {} 并写入 WeakMap,再返回。
ini
function get( object ) {
let map = properties.get( object );
if ( map === undefined ) {
map = {};
properties.set( object, map );
}
return map;
}
典型用法:
ini
const materialProperties = properties.get( material );
materialProperties.program = program; // 存 WebGL 程序
materialProperties.__version = version;
remove(object)
以object 为键从properties 中删除元素。
php
function remove( object ) {
properties.delete( object );
}
update(object, key, value)
当前仓库里似乎没有调用 update,实际多用 get() 后直接赋值。
dispose()
清空整个 WeakMap(新建一个空的),在渲染器销毁时一次性释放所有缓存。
javascript
function dispose() {
properties = new WeakMap();
}
总结
Three.js 对象(Material、Texture、RenderTarget 等)本身不存 WebGL 相关数据(如 __webglTexture、program 等)。
WebGLProperties 可以让这些数据都挂在 WeakMap 里,以对象为 key。