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 对象(MaterialTextureRenderTarget 等)相绑定,避免污染这些对象本身的 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 对象(MaterialTextureRenderTarget 等)本身不存 WebGL 相关数据(如 __webglTextureprogram 等)。

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

相关推荐
爱勇宝1 小时前
AI 都能写代码了,还要学计算机吗?
前端·后端·程序员
石像鬼₧魂石1 小时前
【Y2Ksoft】四季贵州水世界乐园管理系统 —— 玻璃拟态 · 单文件HTML · 开箱即用
前端·html
涛涛ing1 小时前
尤雨溪宣布:Vue 3.6 发布、Vue 4.0 启动、Vite 8 已落地
前端
李伟_Li慢慢1 小时前
05-mini版材质
前端·three.js
学以智用1 小时前
HTTP 请求头 Headers 完整详解
前端·后端
李伟_Li慢慢1 小时前
03-threejs架构原理浅析
前端·three.js
cidy_981 小时前
Codex、Hermes、Claude 使用共享知识库的对比
前端
牧艺1 小时前
浏览器 3D 交互实战:射线拾取、描边高亮与业务面板联动
前端·three.js·数据可视化
叉歪1 小时前
为 UnoCSS 扩展无限色阶与主题换色
前端·css