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移除,这样下一帧筛选时就不会筛选到了。
