Megacity Unity Demo研究,有哪些可以优化?

摘要:1.前言 Megacity Demo发布于2018左右,该Demo相较于之前的Book of the Dead, 体量相对较小,主要演示DOTS相关内容。 近期刚好空闲,故这几天把坑填上。 该Demo已上传百度网盘: 链接:https:
1.前言 Megacity Demo发布于2018左右,该Demo相较于之前的Book of the Dead, 体量相对较小,主要演示DOTS相关内容。 近期刚好空闲,故这几天把坑填上。 该Demo已上传百度网盘: 链接:https://pan.baidu.com/s/1X1gh6hQSRuB0KenlRZsOiw 提取码:iios 打开请使用Unity2019.1.0b7,其中Unity Package部分包会从Unity服务器下载,版本过老, 不保证是否能正确拉取,可以自行修复。 2.Hybrid ECS 部分 先讲一讲用到Hybrid ECS的几个功能。 2.1 HLOD 打开主场景MegaCity.unity后,在任意Section SubScene内,可以看见一些模型都套用有HLOD组件, HOLD指的是场景内的细碎物件在到达最后一级LOD时,将这些物件的最后一级LOD合并进一个Mesh进行显示, 例如远处的三四个房屋,电线杆等等。 合批后将替换为合并Mesh的单个模型,而模型合并操作可以离线进行,提前生成好。 HOLD的缺点是内存中需要多放置HLOD模型,并且存在负优化的情况,具体看项目而定。 在MegaCity Demo中可通过脚本CombineMeshFromLOD.cs进行HLOD模型的离线创建。 而HLOD脚本则是Hybrid ECS内封装了部分功能,通过ECS计算HLOD的显示替换等一些逻辑处理,使用时需要确保LOD Group组件的LOD数量 与HLOD中的LodParentTransforms一致即可,例如下图中有2个Low LOD的GameObject,实际上是2个级别的HLOD: (理论上是单个HLOD Mesh替换,但实际Unity支持多级别HLOD) 2.2 SubScene SubScene是Unity通过DOTS实现的子场景嵌套功能,其核心博主认为是Unity开放的流式场景加载接口: m_Streams[i].Operation = new AsyncLoadSceneOperation(entitiesBinaryPath, sceneData.FileSize, sceneData.SharedComponentCount, resourcesPath, entityManager); m_Streams[i].SceneEntity = entity; 同时SubScene也附带了将场景内容转换为适合流式加载的二进制格式 3.ECS的一些前置概念 在开始看MegaCity之前,我觉得应该先写一些ECS的前置概念。 3.1 筛选机制 常规编写一个Manager类会通过注册(Register)/反注册(Unregister)的机制管理该类的对象, 而ECS中这样的逻辑变为了筛选机制,以MegaCity的BoxTriggerSystem为例,这是一个类似处理OnTriggerEnter事件触发的碰撞管理系统, 碰撞盒的注册通过HybridECS的Mono转换组件进行: ECS的System中,筛选代码如下: m_BBGroup = GetComponentGroup( new EntityArchetypeQuery { All = new ComponentType[] { typeof(BoundingBox) }, None = new ComponentType[] { typeof(TriggerCondition) }, Any = Array.Empty<ComponentType>(), }); 其中含有BoundingBox的ComponentData将会被筛选到对应System中进行处理。 而传统Manager的Unregister操作在ECS中则是将这个ComponentData移除,这样下一帧筛选时就不会筛选到了。
阅读全文