Skip to main content

ICERender 架构设计文档

一份关于 ICERender Canvas 2D 渲染引擎的系统性架构说明,作为该引擎的单一事实来源(single source of truth),与代码库同仓、随版本演进。

目标读者:需要二次开发、维护或评审该引擎的工程师。

引擎定位

ICERender 是一款 Canvas 2D 交互图形渲染引擎(MIT 协议,作者 大漠穷秋)。它借鉴 React 的 props/state 概念构建组件模型,借鉴 W3C EventTarget/jQuery 风格构建事件系统,提供嵌套坐标系、序列化、动画、连接线(Visio 风格)等能力。

核心设计约束(贯穿所有子系统的铁律):

  1. 运行时依赖极简 —— 仅 gl-matrix 一个库,无其它依赖。
  2. 多运行时兼容 —— 同一套代码同时面向 Web 浏览器各类小程序(WeChat/Alipay 等),因此不能依赖浏览器专有 API。
  3. 高性能 —— 脏标记 + 脏矩形局部重绘(默认,条件回退全量重绘)的渲染模型,配合渲染队列缓存与矩阵零分配,保证数千图元的交互流畅度。

子系统模块化设计

引擎不是一个 monolithic 的渲染器,而是由一组职责单一的子系统(Manager / 模块)组合而成。每个子系统只解决一类问题,彼此通过 EventBus 协作。下面的章节一个子系统一小节,逐一拆解其内部机制,并尽量配 Live Demo(可直接把玩的在线示例)与 架构图

子系统核心模块文档Live Demo
运行时 / 帧管理FrameManager · ICE.init01 · 运行时链路
组件模型ICEComponent · props/state · 继承体系02 · 组件模型
坐标系 / 矩阵composedMatrix · gl-matrix03 · 坐标系与矩阵[coordinatecoordinate.html
渲染 / 脏矩形CanvasRenderer · dirty-rect-util04 · 渲染与性能[renderingrendering.html
事件机制ICEEventTarget · EventBus · DOMEventDispatcher05 · 事件系统[eventevent.html
序列化 / 反序列化Serializer · Deserializer · typeId06 · 序列化[serializationserialization.html
交互与动画ICEControlPanelManager · AnimationManager07 · 交互与动画
多运行时兼容cross-platform/root · Path2DRecorder08 · 多运行时兼容
动画机制AnimationManager · Easing · interpolators · AnimationTimeline18 · 动画机制[animationanimation.html
Link 机制ICELinkSlotManager · ICELinkSlot · ICEPolyLine20 · 连线机制[linklink.html
主题机制ICETheme · STYLE_PRESETS · resolveTheme19 · 主题机制[themetheme.html
控制面板机制ICEControlPanelManager · TransformControlPanel · LineControlPanel21 · 控制面板[control-panelcontrol-panel.html
插件机制PluginHost(组件/渲染/工具三层)22 · 插件机制[pluginplugin.html
布局机制ICELayoutManager 策略 + 7 种具体布局(流式 / 网格 / 五区 / 单轴 / 卡片 / 叠加 / 图分层)23 · 布局机制
视口缩放getRenderViewport · 视口矩阵11 · 视口缩放
对齐吸附AlignmentGuideManager12 · 对齐吸附
无障碍原语a11y/accessibility14 · 无障碍原语
i18n 边界引擎 / 组件库 / 应用17 · i18n 边界
导出export/SvgExporter24 · 导出(SVG)
Worker / OffscreenWeb-only 渲染设计10 · Worker/OffscreenCanvas
路线图 / 缺口原语 vs 应用层边界09 · 路线图 · 13 · 能力缺口

子系统协作全景

  • FrameManager跨 ICE 实例共享的全局单例,只负责把 rAF 回调转成 ICE_FRAME_EVENT 广播,不直接渲染。无总线需要帧时空闲停帧(省电),wake() 再唤醒。
  • 每个 ICE 实例持有一条独立的 EventBus,各 Manager 通过订阅这条总线协作。
  • 渲染由 CanvasRenderer 完成,只在 ice.dirty 为真时工作;主题(ICETheme)是被动画、渲染、组件预设共享读取的「设计 token 单一来源」。
  • 序列化(Ser/Des)通过 typeId 反查稳定类型名,使数据不依赖打包后的类名。

阅读建议