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。

相关推荐
小小龙学IT10 分钟前
Go 语言 reflect 反射包深度解析:从 Type/Value 到三大定律与工业实践
前端·golang
小溪学编程19 分钟前
C语言篇:枚举类型
java·c语言·前端
xingpanvip22 分钟前
星盘接口开发文档:推算星座接口指南
前端·php
Da Da 泓25 分钟前
HTML浅浅入门
前端·html
এ慕ོ冬℘゜27 分钟前
es6基础
前端·javascript·es6
熊猫钓鱼>_>33 分钟前
从2D平铺到3D沉浸:我用HarmonyOS 7端侧AI做了一个全程数据不出设备的空间化私密相册
前端·人工智能·3d·华为·华为云·harmonyos·鸿蒙
孔令飞1 小时前
Go中指针引用Go中指针引用Go中指针引用Go中指针引用Go中指针引用Go中指针引用Go中指针引用Go中指针引用Go中指针引用Go中指针引用Go中指针引用Go中
前端
溪语流沙2 小时前
【Web全栈进阶】PostgreSQL上手:Docker跑库 + 把早报站从SQLite迁过去
前端·docker·postgresql
IT_陈寒2 小时前
SpringBoot自动配置的坑:你以为的捷径可能是弯路
前端·人工智能·后端
paopaokaka_luck2 小时前
高校社团管理(AI辅助任务分配、协同过滤算法推荐、ECharts数据可视化、活动参与闭环、校园交流与反馈、器材借还管理)
java·前端·javascript·spring boot·数据分析·echarts