deck.gl StatsWidget 使用指南:在应用中嵌入可折叠的实时性能统计面板
deck.gl StatsWidget 使用指南在应用中嵌入可折叠的实时性能统计面板【免费下载链接】deck.glWebGL2 powered visualization framework项目地址: https://gitcode.com/GitHub_Trending/de/deck.glStatsWidget 是 deck.gl widgets 模块自 v9.2 起以实验性 API 提供中的一个工具型挂件用于把 deck.gl、luma.gl、GPU 设备或用户自定义的 probe.gl 统计对象Stats以可折叠面板的形式叠加在可视化画布上折叠时它以紧凑的按钮形态显示当前 FPS展开时则逐行展示各项统计指标。本文以官方 API 文档为主体结合仓库内 源码实现、样式定义 与 单元测试完整讲解 StatsWidget 的安装、四种数据源类型、全部 Props 参数、内置格式化器、受控/非受控两种状态模式以及源码级渲染原理读完即可把性能监控面板直接集成进自己的 deck.gl 应用。StatsWidget 在 widgets 模块中的定位deck.gl/widgets是围绕 WebGL2/WebGPU 画布提供 UI 组件的模块包含导航类ZoomWidget、GimbalWidget 等、地理类CompassWidget、ScaleWidget 等、信息类PopupWidget、InfoWidget 等以及工具类挂件。按 widgets 模块总览 的分类StatsWidget 与 LoadingWidget、ScreenshotWidget、ThemeWidget 同属Utility Widgets——它不参与地图交互而是为调试与性能观测服务。注意StatsWidget 当前以_StatsWidget命名导出属于实验性 API未来版本可能调整其基类是 Widget与应用中的 Deck 实例通过widgets数组挂接。安装与引入StatsWidget 随deck.gl/widgets发布安装方式与模块内其他挂件一致npm install deck.gl # 或按需安装 npm install deck.gl/core deck.gl/widgets引入时必须同时导入组件与样式表import {Deck} from deck.gl/core; import {_StatsWidget as StatsWidget} from deck.gl/widgets; import deck.gl/widgets/stylesheet.css;样式表提供了 StatsWidget 面板、FPS 按钮、设备标签等的完整外观缺失时会退化为无样式 DOM。若使用 CDN 方式则需分别加载 core、widgets 的 dist 文件及stylesheet.css详见 widgets 模块总览 中的 Standalone Bundle 说明。快速上手四种渲染环境下的用法官方文档给出了 JavaScript、TypeScript、React、React 受控模式四套等价用法全部继承如下JavaScript / TypeScriptimport {Deck} from deck.gl/core; import {_StatsWidget as StatsWidget} from deck.gl/widgets; import deck.gl/widgets/stylesheet.css; new Deck({ widgets: [ new StatsWidget({initialExpanded: true}) ] });TypeScript 写法与 JS 完全一致Props 类型可直接从StatsWidgetProps推导import {_StatsWidget as StatsWidget, type StatsWidgetProps} from deck.gl/widgets; new StatsWidget({} satisfies StatsWidgetProps);React声明式import React from react; import DeckGL, {_StatsWidget as StatsWidget} from deck.gl/react; import deck.gl/widgets/stylesheet.css; function App() { return ( DeckGL StatsWidget initialExpanded / /DeckGL ); }React 封装下挂件以 JSX 子组件形式声明initialExpanded直接作为布尔属性传入。React 受控模式Controlledimport React, {useState} from react; import DeckGL, {_StatsWidget as StatsWidget} from deck.gl/react; import deck.gl/widgets/stylesheet.css; function App() { const [expanded, setExpanded] useState(true); return ( DeckGL StatsWidget expanded{expanded} onExpandedChange{setExpanded} / /DeckGL ); }受控模式下展开状态完全由 React 侧的expandedstate 驱动onExpandedChange负责回写。仓库中 受控挂件测试应用 正是这样把StatsWidget({placement: top-left, expanded, onExpandedChange: setExpanded})与 CompassWidget、ZoomWidget、ThemeWidget 等组合在同一 DeckGL 实例中并在侧栏实时展示statsExpanded状态可作为完整参考。StatsWidgetProps 参数详解StatsWidget除了继承通用的WidgetProps含id、style、className、viewId、placement等还定义了如下专属参数。以下默认值均与 源码 defaultProps 一一对应参数类型默认值说明typedeck \| luma \| device \| customdeck要展示的统计来源类型statsStatsprobe.gl无type: custom时传入的 Stats 实例titlestringStats面板头部显示的标题initialExpandedbooleanfalse是否在启动时展开面板非受控模式初始值framesPerUpdatenumber1每渲染多少帧刷新一次面板内容formattersRecordstring, string \| ((stat) string){}自定义各统计项的格式化器字符串值为内置格式化器名称resetOnUpdateRecordstring, boolean{}是否在每次刷新后重置指定统计项expandedboolean无受控展开状态一旦提供即进入受控模式initialExpanded被忽略onExpandedChange(expanded: boolean) void空函数用户点击头部切换展开状态时的回调受控模式下用它回写expanded关于通用 Props 的补充说明placement源码中类属性与 defaultProps 均设为top-left可选top-left | top-right | bottom-left | bottom-right | fillviewId多视图场景下指定挂件跟随哪个 view 定位与响应事件null时位于共享根容器见 WidgetPropsid默认stats。若同一 Deck 实例挂多个 StatsWidget务必显式设置不同id否则会互相覆盖。type四种统计数据来源这是 StatsWidget 的核心能力。源码 _getStats() 按type分流取数deck默认读取this.deck.metrics即 deck.gl 渲染管线自身的性能指标如setPropsTime、updateAttributesTime、fps等以键值对数组形式展示。这是开箱即用的模式无需任何额外配置luma取luma.stats.stats中的第一个 Stats 组即 luma.gl 层的 WebGL 统计如 GPU 内存占用device取deck.device.statsManager的统计对应当前 GPU 设备WebGL/WebGPU的运行指标custom直接渲染props.stats即用户传入的任意 probe.glStats实例——这也是把业务埋点、请求计数等自定义指标展示在面板上的标准途径。其中device模式还会在面板头部渲染设备标签源码 _getDeviceLabel() 根据device.type显示WebGPU或WebGL。内置格式化器与自定义格式化官方文档列出了五种内置格式化器其具体行为在源码 DEFAULT_FORMATTERS 中可精确对应名称输出示例实现逻辑countRequests: 7原始计数值stat.name: stat.countaverageTimeUpload Time: 12.34msstat.getAverageTime()小于 1000 显示 ms否则换算为 stotalTimeParsing Time: 1.50sstat.time同样按 ms/s 自动换算fpsFrame Rate: 60fpsMath.round(stat.getHz())memoryGPU Memory: 4.2 MBstat.count / 1e6保留一位小数的 MB 值formatters属性支持两种取值内置格式化器名称字符串或自定义函数(stat) string。源码 setProps() 中的解析逻辑是字符串形式会先在DEFAULT_FORMATTERS中查找找不到则回退为默认的 count 格式化器函数形式则直接使用。渲染时 _getLines() 会先按stat.name精确匹配再按stat.type匹配最后回退到默认格式化。一个同时覆盖全部内置格式化器的自定义 Stats 示例与 stats-widget 测试用例 中验证的行为完全一致import {Stats} from probe.gl/stats; import {_StatsWidget as StatsWidget} from deck.gl/widgets; const stats new Stats({id: Custom Stats}); stats.get(Requests).addCount(7); // count stats.get(Upload Time).time 1500; // averageTime stats.get(Parsing Time).time 1500; // totalTime stats.get(Frame Rate, fps).getHz () 60; // fps stats.get(GPU Memory, memory).addCount(4200000); // memory new Deck({ widgets: [ new StatsWidget({ type: custom, stats, expanded: true, formatters: { Upload Time: averageTime, Parsing Time: totalTime, Frame Rate: fps, GPU Memory: memory } }) ] });测试断言确认渲染结果为Custom Stats标题取自stats.id、Requests: 7、Upload Time: 12.34ms、Parsing Time: 1.50s、Frame Rate: 60fps、GPU Memory: 4.2 MB可直接作为自定义指标面板的验收标准。交互行为与刷新机制官方文档明确了三条行为约定折叠态显示一个紧凑的 FPS 按钮点击后展开统计面板展开态点击面板头部可将面板折叠回去自动刷新统计内容按framesPerUpdate指定的帧间隔自动更新。结合源码可以还原完整的实现细节折叠态 FPS 按钮由 FpsIcon 组件 渲染内部通过requestAnimationFrame循环调用deck.metrics.fps实时刷新按钮上的帧率数字展开态的刷新节流onRedraw() 中维护一个_counter仅当counter % framesPerUpdate 0时才调用updateHTML()重渲染面板framesPerUpdate会被Math.max(1, ...)夹取最小为 1即每帧刷新resetOnUpdate在 onRenderHTML() 中每次渲染后会对resetOnUpdate[name] true的统计项调用stat.reset()适用于只关心两次刷新之间的增量类指标折叠态不刷新onRedraw开头会判断getExpanded()折叠时不执行面板更新仅保留 FPS 按钮的 rAF 循环开销极小。受控与非受控模式与 React 表单组件类似StatsWidget 同时支持两种状态管理模式非受控默认内部维护_expanded私有状态initialExpanded决定初始值用户点击头部时内部自动翻转状态并触发重渲染也可以同时提供onExpandedChange回调做受控监听但不受控驱动的观察者用法受控一旦传入expanded属性内部状态被忽略。源码 _toggleExpanded() 的行为是始终先调用onExpandedChange(nextExpanded)通知外部然后仅在props.expanded undefined即非受控时才更新内部状态并调用updateHTML()受控模式下则等待父组件通过setProps传入新的expanded来驱动界面。任何模式下都可调用getExpanded()读取当前展开状态受控时返回 prop 值非受控时返回内部状态。这一语义在 测试用例 中被逐条验证initialExpanded: true时getExpanded()返回true默认构造返回false折叠受控模式下_toggleExpanded()只触发onExpandedChange(false)而内部状态保持true非受控模式下_toggleExpanded()使内部状态从false变为true并触发回调。渲染结构与样式定制StatsWidget 的 DOM 由 onRenderHTML() 用 preact 渲染生成结构如下div.deck-widget-stats-container ├── div.deck-widget-stats-header可点击含 b标题/b、设备标签、下拉箭头按钮 └── div.deck-widget-stats-content逐行统计文本white-space: pre对应样式位于 stylesheet.css面板使用等宽字体monospace、圆角容器、阴影与主题色 CSS 变量如--menu-background、--menu-text、--button-corner-radius设备标签为胶囊形徽章。由于所有配色都通过 CSS 变量定义StatsWidget 能自然适配 样式与主题 中介绍的主题切换如DarkGlassTheme/LightGlassTheme。多视图与定位StatsWidget 是有 UI 面板的挂件支持通过placement与viewId定位默认top-left、viewId: null。在多视图场景下可以这样把统计面板绑定到指定地图new Deck({ views: [ new MapView({id: left-map}), new MapView({id: right-map}) ], widgets: [ new StatsWidget({viewId: left-map, placement: top-right}) ] });此时面板会相对于left-map视图容器定位并只对该视图内的渲染事件响应刷新若viewId为null则位于共享根容器、跟随整个 Deck 的重绘周期刷新。更完整的多视图、多画布行为说明见 Widget 文档 与 Using Multiple Views 指南。小结StatsWidget 以极低的接入成本为 deck.gl 应用提供了开箱即用的性能观测面板默认type: deck零配置即可看到渲染管线指标与实时 FPSluma/device覆盖底层图形栈与 GPU 设备统计custom则借助 probe.gl 的Stats模型把任意业务指标接入同一面板。配合framesPerUpdate刷新节流、resetOnUpdate增量统计、五种内置格式化器与受控/非受控双模式它既能当开发期调试工具也能作为线上展示帧率 资源占用的常驻 UI。若需深入原理可继续阅读 StatsWidget 源码、widgets 模块总览 及 受控挂件示例。【免费下载链接】deck.glWebGL2 powered visualization framework项目地址: https://gitcode.com/GitHub_Trending/de/deck.gl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考