07-WebGLProperties

16 阅读1分钟

源码:github.com/buglas/thre…

WebGLProperties 比较简单,不需要mini 版,我们直接看其源码。

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 对象(MaterialTextureRenderTarget 等)相绑定,避免污染这些对象本身的 API。

WebGLProperties 方法说明

has(object)

判断某个对象是否已有属性记录。

function has( object ) {
    return properties.has( object );
}

get(object)(最常用)

以object 为键从properties 中获取值;

若不存在则自动创建 {} 并写入 WeakMap,再返回。

function get( object ) {
    let map = properties.get( object );
    if ( map === undefined ) {
        map = {};
        properties.set( object, map );
    }
    return map;
}

典型用法:

const materialProperties = properties.get( material );
materialProperties.program = program;  // 存 WebGL 程序
materialProperties.__version = version;

remove(object)

以object 为键从properties 中删除元素。

function remove( object ) {
    properties.delete( object );
}

update(object, key, value)

当前仓库里似乎没有调用 update,实际多用 get() 后直接赋值。

dispose()

清空整个 WeakMap(新建一个空的),在渲染器销毁时一次性释放所有缓存。

function dispose() {
    properties = new WeakMap();
}

总结

Three.js 对象(MaterialTextureRenderTarget 等)本身不存 WebGL 相关数据(如 __webglTextureprogram 等)。

WebGLProperties 可以让这些数据都挂在 WeakMap 里,以对象为 key。