Skip to content

createEngine ​

createEngine(options?) 创建完整且初始 stopped 的 Engine。模块可以在 SSR 环境导入,但调用工厂需要 browser document 与 WebGL。

最小用法 ​

ts
import { createEngine } from '@tripo3d/engine';

const engine = createEngine();
document.querySelector('#viewer')!.append(engine.canvas);
engine.start();

Engine 自己创建 Canvas,业务只负责把 engine.canvas 放进 DOM。Core 不提供 mount/unmount/remount/onMount。

选项 ​

ts
const engine = createEngine({
  renderer: {
    alpha: true,
    antialias: false,
  },
  pixelRatio: [1, 2],
  pipeline: {
    // 可选:显式开启离屏 MSAA;默认保持 0。
    samples: 0,
    stencil: false,
  },
  plugins: [myPlugin],
});
名称 类型 默认值 说明
rendererOmit<WebGLRendererParameters, canvas | context | outputBufferType>—传给原生 WebGLRenderer。alpha 默认 true,antialias 默认 false;三个设备 identity 字段由 Engine 独占。
pixelRationumber | device | readonly [min, max]device固定 DPR、设备 DPR 或设备 DPR 静态保护区间。
pipelinePipelineOptions—私有 Composer render target 的 samples 与 stencil 能力;samples 默认 0,与 renderer.antialias 独立。
pluginsreadonly Plugin[]—仅构造期按顺序安装;按 identity 去重。

所有普通参数与 Plugin shape 都在取得原生资源前校验。Plugin setup、浏览器资源或初始 resize 任一步失败时,构造会终结已取得 owner 并抛出首因;不会返回半可用 Engine。

默认对象 ​

createEngine() 会创建:

  • engine.canvas 与 engine.renderer;
  • engine.world,其根是与原生 Scene 一一对应的 Entity;
  • engine.camera:PerspectiveCamera(45, 1, 0.01, 1000),位置 z = 3;
  • engine.view:绑定默认 World/Camera 的全屏 RenderView;
  • engine.pipeline 与 engine.pointer。

只有默认 View 的 viewport 或 Canvas 尺寸变化会自动更新默认 Camera aspect。业务 View 的 Camera 由业务维护投影和 world matrix。

启停与尺寸 ​

ts
engine.start();
console.log(engine.running, engine.size);

engine.stop();  // 不释放场景或 GPU 资源
engine.start(); // 重新测量 Canvas,resume 首帧 delta = 0

start() 幂等,stop() 也幂等。ResizeObserver 在 Engine 生命周期内持续观察 Canvas;即使 stopped,尺寸变化仍可提交。start 会再主动测量一次,覆盖 detached/hidden 期间遗漏的变化。

DPR 策略:

  • 数字:固定 DPR;
  • 'device':跟随设备 DPR;
  • [min, max]:跟随设备 DPR,但将其限制在静态区间内。

Engine 不采样帧率,也不会因为模型导入或其他运行时掉帧自动修改 DPR。只有 Canvas 逻辑尺寸或真实设备 DPR 变化才会进入 resize transaction。

Engine 控制面 ​

名称签名说明
createEntity / getEntity(root?) => Entity / (object) => Entity | undefined全量接纳 parentless raw subtree,或反查一一 binding。
createWorld / destroyWorld(root?) => World / (world) => boolean创建或销毁额外 World;默认 World 不能单独销毁。
addSystem / getSystem / removeSystemDefinition identity based管理 Engine-global System owner。
onEvent / onceEvent / emitEventEngineEvent token based同步类型化事件。
start / stop() => void控制唯一 frame loop。
dispose() => void发布不可逆终态并尽力释放全部 Engine owner。

dispose ​

ts
try {
  engine.dispose();
} catch (error) {
  // 一个清理错误保持原 identity;多个错误为 AggregateError。
}

dispose 先停止观察与帧循环,并让公开 topology 不再可见;随后清理 System、Pass、World/Entity/Script、Pointer、Plugin、内部 Composer/Pass 与 renderer。业务终态回调即使抛错,也不会阻止 sibling owner 与 renderer-last 尝试。

第一次调用即发布 engine.disposed === true。不要把第二次调用当成 recovery:它只保持幂等,不重试业务回调。

下一步 ​

基于 MIT 协议发布(内部使用)