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。

相关推荐
invicinble9 分钟前
把握理解技术文章转化为工程水平的深度理解
前端
前端炒粉12 分钟前
fetch+readablestream(Streamable)流式输出
java·服务器·前端
风骏时光牛马16 分钟前
AIRAG服务异常监控告警
前端
大厂码农老A20 分钟前
汤森路透的座上宾?Qwen3.5-397B-A17B到底有什么本事?
前端·人工智能·后端
静开28 分钟前
Skills和MCP 到底什么区别
前端·人工智能
伯远医学34 分钟前
RIP-seq 高分文献案例分享
java·前端·javascript·人工智能·算法·eclipse·html
hunterandroid34 分钟前
[鸿蒙从零到一] LazyForEach 复用陷阱与 KeyGenerator 设计实战
前端
Hilaku40 分钟前
Web Components 为什么火不起来?
前端·javascript·程序员
Liora_Yvonne1 小时前
从数据库到 Vue 页面:用 LY Fullstack 完成第一个真实全栈业务模块
前端·后端·nestjs
hunterandroid1 小时前
自定义 View 绘制与触摸冲突:从滑动卡顿到事件分发闭环
android·前端