本帖最后由 复读机读复读机 于 2025-5-9 17:20 编辑
一句话结论:044版本后,在动态生成可能会持续静态存在的物体(如场景建筑、植被)时,请直接在 spawn 时直接传参,能提高5~10倍的生成速度,节约性能。
1. 什么是 Instance?
在口袋方舟中,Instance(实例化对象) 是指多个相同 mesh 的共享副本,它们共用底层数据(如顶点、材质),但可以独立设置位置、旋转等属性。它的优势是 渲染效率极高,适合大批量静态物体(如场景装饰、植被等)。
2. 本次优化了什么?
本次优化改进了 GameObject.spawn()、GameObject.asyncSpawn() 的底层逻辑,使其在生成含 mesh 的物体(如模型或预制体)时,会优先引用 Instance(实例化对象),而非直接生成完整动态实例,预期提升生成速度 5~10 倍。
2.1 目的是什么?
优化前:所有 spawn 的物体都会直接生成动态实例,即使不需要修改,也会消耗较多性能。
优化后:
- 在 spawn/asyncSpawn时将会优先生成对象的Instance,生成速度因此可以提升5~10倍,同时可以大大降低内存的消耗。
- 如果后续需要修改对象属性(如移动、换材质),引擎才会将其转为动态实例,此时会有额外开销。
2.2 我该怎么写代码?
✅ 推荐做法:在 spawn 时直接往方法里传参将 Transform设置好,避免后续修改属性,触发instance转换造成额外开销。
// 高效:生成 Instance,适合静态物体
GameObject.spawn("360262", { transform: new Transform() });
❌ 不推荐做法:先 spawn 再设置属性,会触发instance转换,降低性能↓ 。 如非必要,请按推荐做法写代码 ↑
// 低效:先生成动态实例,再修改属性
let obj = GameObject.spawn("360262");
// ↓ 触发动态化,性能损耗!
obj.transform.position = new Vector(1, 2, 3);
2.3 适用场景
动态生成可能会持续静态存在的物体(如场景建筑、植被)时,请直接在 spawn 时传参,节省性能,提高效率
总结:“能静态就静态,传参要趁早”,这样既能提升生成速度,又能减少运行时负担! 🚀
3. 附:实验对比数据
以下内容在0.44及以上的版本生效,测试设备:A57(百元低配二手机),画质分级:最低画质等级
- 生成模型为“360262”基础正方体,大小随机,客户端生成,每次生成1000个。排列为40*40矩阵。
- 调用spawn接口直接生成,生成后不再切换材质、位置
先说结论:在连续生成同一材质对象下
- 生成速度有明显的上升,连续生成的稳定性也有明显的改善
- 目前生成上限与渲染上限相关
1. 10000 块相同材质物体
优化前 平均生成时间6s
优化后 平均生成时间0.5s
2. 15000 块相同材质物体
优化前 平均生成时间7s
优化后 平均生成时间0.5s
3. 20000块相同材质物体(该机型旧版本生成数量极限,超出该数量后会频繁崩溃)
优化前 平均生成时间7s
优化后 平均生成时间0.5s
4. 25000块相同材质物体(优化后无明显卡顿)
5. 30000块相同材质物体(优化后无明显卡顿)
6. 35000块相同材质物体(优化后无明显卡顿)
7. 40000块相同材质物体(优化后无明显卡顿)
8. 70000块相同材质物体(生成时无明显卡顿)
9. 10W+相同材质物体测试
继续生成时无明显卡顿
|