性能
高斯泼溅可能同时消耗大量 CPU 和 GPU。以下策略有助于改善性能。
限制单元数量
每帧都要按相机深度排序,因此需控制场景单元数。可在 SuperSplat 编辑器的 SPLAT DATA 面板检查资源数量,并裁除 PLY 中不需要的单元。
大场景可用流式 SOG,按相机距离动态加载细节,显著减少同时活动数量,在重要位置保持质量。
填充率
3DGS 的填充率,即片元操作成本,尤其高,原因是:
- 高过度绘制:每个单元是带纹理的广告牌四边形,经常与许多其他单元重叠。
- 透明混合:平滑外观依赖逐片元 alpha 混合,成本较高。
- 片元密度:稠密数据可能让每个最终像素处理数十甚至数百个片元。
因此像素数和渲染设置优化对性能至关重要。
场景设置
针对片元密集特性,以下设置影响显著:
- 禁用 Anti-Alias:抗锯齿增加每像素处理量,对此类渲染尤其昂贵。
- 禁用 Device Pixel Ratio:降低总像素分辨率,直接减少片元数。
两者均降低主要瓶颈——片元处理负载。
流式 SOG 配置
流式 SOG 提供多个质量与性能选项,推荐以全局预算自动管理场景全部资源的 LOD。
全局单元预算
splatBudget 是主要性能控制,默认 100 万,通过以下方式设置:
app.scene.gsplat.splatBudget = 4000000; // 4 million splats
引擎自动调整各资源 LOD 以符合预算,近处保持精细,先降低远处。默认预算是目标,无论相机位置都尽量提高细节直至用满,保持工作量稳定。0 或负值表示无预算。
预算涵盖流式多 LOD 和固定单 LOD 资源。固定资源始终完整渲染,其数量占用预算,剩余供流式资源使用。
LOD 距离与预算模式
各组件用 lodBaseDistance 指定 LOD 0 到 1 的距离,lodMultiplier 指定后续切换距离倍率。提高任一值,让精细层保留更远,但内存更高。全局 splatBudgetMode 决定结合方式:默认 GSPLAT_BUDGET_TARGET 中距离只塑造衰减、预算决定总细节;GSPLAT_BUDGET_LIMIT 中距离决定细节,仅超预算时下调:
entity.gsplat.lodBaseDistance = 10; // LOD 0 out to 10 units
entity.gsplat.lodMultiplier = 4; // then LOD 1 to 40 units, LOD 2 to 160, ...
app.scene.gsplat.splatBudgetMode = pc.GSPLAT_BUDGET_LIMIT;
详见 LOD 行为。距离还会自动补偿 FOV,广视角使对象更小,因此更早使用粗层。
LOD 范围限制
组件的 lodRangeMin 和 lodRangeMax 限制可用层级:
entity.gsplat.lodRangeMin = 0; // Allow highest quality LOD
entity.gsplat.lodRangeMax = 3; // Never go lower than LOD 3
适合:
- 减少下载:慢网络上提高 min,避免下载最高质量的大文件。
- 限制内存:避免加载某些细节层。
但常规性能管理中,全局预算比逐资源范围限制更有效,因为它会根据整个场景自动平衡,范围限制则不考虑相机或场景构成。
快速首帧
大流式场景可先只加载最低细节,几乎立即显示,再流入高细节,避免屏幕一直等待。
分两步:
- 创建资源时将 LOD 限制为最粗层,先加载最少数据。
- 监听 frame:ready,粗数据加载并绘制完成、无待加载任务时,恢复完整范围,按距离继续流入。
const gsplatSystem = app.systems.gsplat;
// `entity` has a gsplat component using a loaded Streamed SOG asset
const gsplat = entity.gsplat;
// 1. Start with the lowest (coarsest) LOD only, for the fastest first frame
const lodLevels = gsplat.resource?.octree?.lodLevels;
if (lodLevels) {
const worstLod = lodLevels - 1;
gsplat.lodRangeMin = worstLod;
gsplat.lodRangeMax = worstLod;
}
// 2. Once the coarse data is loaded and rendered, open the LOD range back up
// so higher-detail levels stream in
const onFrameReady = (camera, layer, ready, loadingCount) => {
if (ready && loadingCount === 0) {
gsplatSystem.off('frame:ready', onFrameReady);
// restore the full LOD range (0 = highest detail)
gsplat.lodRangeMin = 0;
gsplat.lodRangeMax = lodLevels - 1;
}
};
gsplatSystem.on('frame:ready', onFrameReady);
技术示例见流式 SOG 实时示例。
推荐配置
多数应用建议:
- 按目标硬件设置预算,例如移动端 100 万、桌面 300 万以上。
- 保留默认范围,min=0、max=最高可用层,除非有下载或内存限制。
- 调整距离塑造衰减。若希望在指定距离切换,而非由预算决定位置,使用 GSPLAT_BUDGET_LIMIT。