跳转至

Manager 模块

Manager 模块是当前应用架构的骨干。它将功能组织到专注的 Manager 类中,而不是单一的单体应用中。这种 基于 Manager 的架构 提供了清晰的关注点分离、改进的可测试性和更好的可扩展性。

概览

本模块提供的关键 Manager:

  • ModelManager – 存储模型元数据、可见性,并提供统一的模型接口。
  • FileLoader – 加载并解析多种高斯格式(PLY, SPZ, KSplat, SPLAT, SOG, Compressed PLY)和 FBX。
  • GaussianLoader – 高级便捷服务,包装 FileLoader 和 ONNXManager 以创建 GaussianModel 实例。
  • ONNXManager – 加载 ONNX 模型并协调 GPU 端推理。
  • FBXLoaderManager – 用于 FBX 网格文件的专用加载器。
  • CameraManager – 管理视图/投影状态和控制器切换(Orbit/FPS)。
  • AnimationManager – 通过节流和性能跟踪更新动态模型(ONNX 驱动或其他)。
  • RenderLoop – 拥有渲染/更新循环、帧调度和 FPS 跟踪。

架构原则

  • 单一职责 – 每个 Manager 专注于一个功能领域。
  • 依赖注入 – Manager 通过构造函数接收协作对象以获得可测试性。
  • 接口分离 – 清晰的契约保持低耦合。
  • 开/闭 – Manager 易于扩展而无需修改现有代码。
  • Manager 协调 – App 类编排 Manager,但不拥有它们的逻辑。
  • 格式无关 – FileLoader 使用 IO 模块的 defaultLoader 进行统一格式处理。

用法

基础

const modelManager = new ModelManager(10_000);
const cameraManager = new CameraManager();
const animationManager = new AnimationManager(modelManager);
const renderLoop = new RenderLoop(modelManager, animationManager, cameraManager);

// 设置加载回调
const loadingCallbacks = {
  onProgress: (show, text, pct) => console.log(`Loading: ${pct}%`),
  onError: (msg) => console.error(msg),
};

const fileLoader = new FileLoader(modelManager, loadingCallbacks);
const onnxManager = new ONNXManager(modelManager);
const gaussianLoader = new GaussianLoader(fileLoader, onnxManager);

const app = new App();
await app.init();

高级 - 直接访问 Manager

const app = new App();
await app.init();

// 直接访问 Manager 以进行高级操作
const modelManager = app.getModelManager();
const fileLoader = app.getFileLoader();
const onnxManager = app.getONNXManager();
const cameraManager = app.getCameraManager();
const animationManager = app.getAnimationManager();
const renderLoop = app.getRenderLoop();

// 使用 GaussianLoader 进行高级模型创建
const gaussianLoader = new GaussianLoader(fileLoader, onnxManager);
const model = await gaussianLoader.createFromGaussian(renderer, 'model.spz');

加载不同格式

// 通过 FileLoader 加载高斯格式
await fileLoader.loadFile(file, device); // 自动检测格式
await fileLoader.loadSample('model.spz', device, 'gaussian');

// 通过 GaussianLoader 加载 (创建 GaussianModel)
const model = await gaussianLoader.createFromSPZ(renderer, 'model.spz');
const model2 = await gaussianLoader.createFromKSplat(renderer, 'model.ksplat');
const model3 = await gaussianLoader.createFromONNX(renderer, 'model.onnx', camMat, projMat);

相关文档

  • Architecture – 解释 Manager 编排、依赖注入和生命周期。
  • API Reference – 每个 Manager 的方法表面以及共享接口。
  • App 模块 – 展示 Managers 如何在运行时外壳内组合。