|
?????????????DOTS??Unity????????????????C# Job System???????ECS?Burst Compiler????????????????????????????????Far North Entertainment?
?Unite Copenhagen???????Far North Entertainment???????????????????????Unity?????DOTS???
Far North Entertainment
????????Far North Entertainment??5??????????????????2018???Gear VR?????Down to Dungeon??????????????????????????
?????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????Anders Eriksson?????DOTS???????Object-oriented??????????Data-oriented????
Anders Eriksson??????????????????????????????????????????????????????????????????????????????
??????????????????Anders Eriksson?????????????????????????????????????????????????????????CPU????????????????????????????????????????????????????????SIMD???
???????????????Unity????????????????ID??????????????????????????Archetypes?????????????????
Anders Eriksson??????ECS??SQL??????????????????Archetype?????????????????????????????????????????Archetype?????????????
????DOTS
????????Anders Eriksson?????????????ECS???????Unity?Nordeus??????????
???????????????????????????CppCon 2014???Mike Acton???????????????????????????????????
Far North Entertainment?????????????????????9?????Unite Copenhagen????????????????????????
????????????????????????????ECS?C# Job System?Burst Compiler??????
??????
Anders Eriksson??????????????????????????????????????
???????????????????ZombieView???????????????EntityView???EntityView?????????MonoBehaviour??????????????????ZombieView????Update????????????????????
??????????????????????????????????????????????CPU????????????????????????
?????????????????CPU???????????????????CPU???????????????128???256???????
????????DOTS????????????????????????????????ZombieView????Update??????????????????????????????????
???????2D?????????????????????????????????????????????????????????????????
- [Serializable]
- public struct PositionData2D : IComponentData
- {
- public float2 Position;
- }
-
- [Serializable]
- public struct HeadingData2D : IComponentData
- {
- public float2 Heading;
- }
-
- [Serializable]
- public struct TargetPositionData : IComponentData
- {
- public float2 TargetPosition;
- }
复制代码
????????Archetype???Archetype??????????????????????????????????????????????????????????????????????????????Archetype???
????????ComponentDataProxy????????ComponentDataProxy???????????????MonoBehaviour????EntityManager?????????????????????????????????????????????????ArchetypeChunks????????16kb????????
???????????????????????
Anders Eriksson???????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????16kb?????????????????????????????????????????????????????????????
??????????
???????????????????????????????????????C# Job System???CPU??????????
?????????????PositionData2D?HeadingData2D?TargetPositonData????????????????????
???Anders Eriksson???????JobComponentSystem????OnCreate??????????
???????
- private EntityQuery m_Group;
- protected override void OnCreate()
- {
- base.OnCreate();
- var query = new EntityQueryDesc
- {
- All = new []
- {
- ComponentType.ReadWrite<PositionData2D>(),
- ComponentType.ReadWrite<HeadingData2D>(),
- ComponentType.ReadOnly<TargetPositionData>()
- },
- };
- m_Group = GetEntityQuery(query);
- }
复制代码
????????????????????????????????????????C# Job System?????????????????????????
Andres Eriksson???C# Job System??????C# Job System??Unity?????????????????????????????????CPU???????????????????
????????????????????????????????????????????IJobChunk????????????????????????
????????UpdatePositionAndHeadingJob?????????????????????
????????????
- protected override JobHandle OnUpdate(JobHandle inputDeps)
- {
- var positionDataType = GetArchetypeChunkComponentType<PositionData2D>();
- var headingDataType = GetArchetypeChunkComponentType<HeadingData2D>();
- var targetPositionDataType = GetArchetypeChunkComponentType<TargetPositionData>(true);
-
- var updatePosAndHeadingJob = new UpdatePositionAndHeadingJob
- {
- PositionDataType = positionDataType,
- HeadingDataType = headingDataType,
- TargetPositionDataType = targetPositionDataType,
- DeltaTime = Time.deltaTime,
- RotationLerpSpeed = 2.0f,
- MovementLerpSpeed = 4.0f,
- };
-
- return updatePosAndHeadingJob.Schedule(m_Group, inputDeps);
复制代码
????????
- public struct UpdatePositionAndHeadingJob : IJobChunk
- {
- public ArchetypeChunkComponentType<PositionData2D> PositionDataType;
- public ArchetypeChunkComponentType<HeadingData2D> HeadingDataType;
- [ReadOnly]
- public ArchetypeChunkComponentType<TargetPositionData> TargetPositionDataType;
- [ReadOnly] public float DeltaTime;
- [ReadOnly] public float RotationLerpSpeed;
- [ReadOnly] public float MovementLerpSpeed;
复制代码
????????????????????????????????
???????????
- public void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex)
- {
- var chunkPositionData = chunk.GetNativeArray(PositionDataType);
- var chunkHeadingData = chunk.GetNativeArray(HeadingDataType);
- var chunkTargetPositionData = chunk.GetNativeArray(TargetPositionDataType);
- for (int i = 0; i < chunk.Count; i++)
- {
- var target = chunkTargetPositionData[i];
- var positionData = chunkPositionData[i];
- var headingData = chunkHeadingData[i];
- float2 toTarget = target.TargetPosition - positionData.Position;
- float distance = math.length(toTarget);
- headingData.Heading = math.select(
- headingData.Heading,
- math.lerp(headingData.Heading,
- math.normalize(toTarget),
- math.mul(DeltaTime, RotationLerpSpeed)),
- distance > 0.008
- );
- positionData.Position = math.select(
- target.TargetPosition,
- math.lerp(
- positionData.Position,
- target.TargetPosition,
- math.mul(DeltaTime, MovementLerpSpeed)),
- distance <= 1
- );
- chunkPositionData[i] = positionData;
- chunkHeadingData[i] = headingData;
- }
- }
复制代码
Anders Eriksson??????????????Select?????Branch?????????????????????
Select???????????????????????????????????????????Select????????????CPU??????????????
??Burst Compiler????
???????????????DOTS??????????Burst Compiler?
????????????????????Unity???Mathematics????????????BurstCompile??????????
- [BurstCompile]
- public struct UpdatePositionAndHeadingJob : IJobChunk
- {
- public ArchetypeChunkComponentType<PositionData2D> PositionDataType;
- public ArchetypeChunkComponentType<HeadingData2D> HeadingDataType;
- [ReadOnly]
- public ArchetypeChunkComponentType<TargetPositionData> TargetPositionDataType;
- [ReadOnly] public float DeltaTime;
- [ReadOnly] public float RotationLerpSpeed;
- [ReadOnly] public float MovementLerpSpeed;
复制代码
Burst Compiler????????????SIMD???????????????????????????????????????????128??????????????????
????Burst Compiler???????????C# Job System??????????????????
??????????????????????????
?????????????????????????????????????????????????????????????????????????CPU???????????Burst Compiler?????????SIMD????????????
DOTS????
????Far North Entertainment?????DOTS????????
????????????????ECS?????????????????????
?ECS?????????Archetype?????????????????????????
??????????????????CPU?????????
????????????????????????????????????????
??????????????????????????????????????Unity?Native???????????????????????
??????????????????????
????C# Job System???????CPU???
????????Burst Compiler?????SIMD????????Burst Inspector?????
???????????????UDP??????????????????????
?????????????Anders Eriksson?????????????????????????????????DOTS???????????????
??
Anders Eriksson????Unite??????DOTS?????Unity Physics?Live Link??????????????????????DOTS??????????????????ECS?????Unity??????????????????
|
|