基础概念
本文档介绍了 NIVIOBIM 图形引擎的核心概念和架构设计,帮助您更好地理解和使用引擎。
架构概述
NIVIOBIM 图形引擎采用模块化架构设计,主要分为以下几个层次:
┌─────────────────────────────────────────┐
│ 应用层 │
├─────────────────────────────────────────┤
│ 插件层 │
├─────────────────────────────────────────┤
│ 核心层 │
├─────────────────────────────────────────┤
│ 管理器层 │
├─────────────────────────────────────────┤
│ 模型层 │
├─────────────────────────────────────────┤
│ 加载器层 │
├─────────────────────────────────────────┤
│ 渲染层 │
└─────────────────────────────────────────┘核心组件
Viewer3D 主引擎
Viewer3D 是引擎的核心类,负责协调各个组件的工作:
- 场景管理:管理3D场景和2D标签场景
- 渲染控制:控制WebGL和CSS2D渲染
- 模型加载:支持多种格式的模型加载
- 插件系统:管理扩展功能
- 交互控制:处理用户交互
管理器系统
引擎包含多个专门的管理器,各司其职:
SceneManager - 场景管理器
详见 SceneManager
- 管理几何场景和CSS场景
- 协调各个子管理器
- 计算场景边界
- 控制对象可见性
RenderManager - 渲染管理器
- 管理WebGL和CSS2D渲染器
- 提供FPS监控
- 支持渐进式渲染
- 管理环境贴图
CameraManager - 相机管理器
- 管理透视相机和正交相机
- 提供轨道控制器
- 支持相机动画
- 管理视点标记
LightManager - 灯光管理器
详见 LightManager
- 管理各种类型的灯光
- 控制阴影效果
- 支持自定义灯光
- 优化光照性能
DataManager - 数据管理器
详见 DataManager
- 管理3D模型数据
- 存储2D对象
- 管理属性数据
- 提供数据检索
EventManager - 事件管理器
详见 EventManager
- 提供统一的事件系统
- 管理事件监听器
- 支持事件分发
- 提供资源清理
ExtensionManager - 扩展管理器
- 管理插件系统
- 支持插件注册
- 提供插件更新
- 管理插件生命周期
模型系统
Model - 模型基类
详见 Model
- 继承自Three.js的Group
- 管理各种对象组
- 提供边界计算
- 支持序列化
对象组类型
- InstancedObjects:实例化对象,用于优化相同几何体的渲染
- MergedObjects:合并对象,用于减少绘制调用
- SingleObjects:单对象,用于处理独立对象
BVH树系统
- 用于优化碰撞检测
- 支持射线拾取
- 提供视锥剔除
- 优化渲染性能
加载器系统
NIVIOBIMLoader
- 支持NIVIOBIM格式
- 提供流式加载
- 支持本地文件加载
- 支持glTF/GLB格式
插件系统
Plugin - 插件基类
详见 Plugin
- 继承自EventManager
- 提供插件开发框架
- 支持插件生命周期
- 提供资源管理
内置插件
- Measure:测量工具
- Section:截面分析
- SkyBox:天空盒
- ViewCubeControl:视图立方
- FirstPersonControl:第一人称控制
- DrawingMapModel:图模映射
数据流
模型加载流程
配置文件 → NIVIOBIMLoader → Model → SceneManager → RenderManager- 配置阶段:创建Config对象,设置模型路径和参数
- 加载阶段:NIVIOBIMLoader加载模型数据
- 处理阶段:将数据转换为Model对象
- 场景阶段:SceneManager将模型添加到场景
- 渲染阶段:RenderManager渲染场景
事件处理流程
用户交互 → EventManager → 插件系统 → 场景更新 → 渲染更新- 交互阶段:用户进行鼠标、键盘等操作
- 事件阶段:EventManager分发事件
- 插件阶段:插件处理事件并更新状态
- 场景阶段:场景根据插件状态进行更新
- 渲染阶段:RenderManager重新渲染场景
性能优化
渲染优化
- 实例化渲染:相同几何体使用InstancedMesh
- 合并渲染:相同材质的几何体合并绘制
- LOD系统:根据距离调整细节级别
- 视锥剔除:只渲染可见对象
内存优化
- 对象池:重用对象减少GC压力
- 纹理压缩:使用压缩纹理格式
- 几何体优化:减少顶点数量
- 材质共享:相同材质共享实例
加载优化
- 流式加载:分批加载大型模型
- 渐进式渲染:逐步显示对象
- 缓存机制:缓存已加载的资源
- 预加载:提前加载可能需要的资源
扩展开发
插件开发
javascript
class MyPlugin extends Plugin {
constructor(viewer3D, options) {
super(viewer3D, options);
this.name = 'MyPlugin';
}
// 初始化方法(自定义)
init() {
// 插件初始化
}
update(deltaTime) {
// 插件更新
}
dispose() {
// 资源清理
super.dispose();
}
}最佳实践
内存管理
- 及时释放资源:调用dispose方法清理资源
- 避免内存泄漏:正确移除事件监听器
- 监控内存使用:定期检查内存使用情况
- 使用弱引用:避免循环引用
错误处理
- 捕获异常:使用try-catch处理异常
- 提供回退:在出错时提供备用方案
- 记录日志:记录错误信息便于调试
- 用户提示:向用户显示友好的错误信息