07-WebGLProperties

源码:github.com/buglas/thre...

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。

相关推荐
程序员海军24 分钟前
尤雨溪 : Vue 4 已经在规划中了!
前端·javascript·vue.js
2601_9499706935 分钟前
HumanizeDuration 跨端三方库仓颉适配全流程
前端·javascript·flutter
风骏时光牛马2 小时前
后端服务接口开发与性能优化
前端
kyriewen2 小时前
我让 4 个 AI 互相 review 代码,最温柔的那个下手最狠
前端·程序员·ai编程
计算机魔术师3 小时前
493家公司白砸AI钱?Apollo这组数据戳破了幻觉
前端
IT_陈寒3 小时前
Java静态变量初始化坑得我头皮发麻
前端·人工智能·后端
柳杉3 小时前
用 Codex 完成智慧高速 3D 可视化大屏,从 18 张行业设计稿到可交互的运行监测中心
前端·ai编程·数据可视化
review445433 小时前
拿到 codex 第一步
前端·agent·vibecoding
鶴哥只手遮天4 小时前
jQuery 4.0 源码架构与工程实践-第 01 章 · 全景与工程结构:一个 20 岁库的自省
前端·javascript·jquery
徐小夕4 小时前
doc2docx方案,开源!
前端·vue.js·github