/// <summary> /// Constructs a set of changes between the given src and dst chunks. /// </summary> /// <remarks> /// A chunk is considered unchanged if the <see cref="Chunk.SequenceNumber"/> matches and all type change versions match. /// </remarks> internal static ArchetypeChunkChanges GetArchetypeChunkChanges( NativeArray <ArchetypeChunk> srcChunks, NativeArray <ArchetypeChunk> dstChunks, Allocator allocator, out JobHandle jobHandle, JobHandle dependsOn = default) { var archetypeChunkChanges = new ArchetypeChunkChanges(allocator); var srcChunksBySequenceNumber = new NativeHashMap <ulong, ArchetypeChunk>(srcChunks.Length, Allocator.TempJob); var buildChunkSequenceNumberMap = new BuildChunkSequenceNumberMap { Chunks = srcChunks, ChunksBySequenceNumber = srcChunksBySequenceNumber.AsParallelWriter() }.Schedule(srcChunks.Length, 64, dependsOn); var gatherArchetypeChunkChanges = new GatherArchetypeChunkChanges { SrcChunks = srcChunks, DstChunks = dstChunks, SrcChunksBySequenceNumber = srcChunksBySequenceNumber, CreatedChunks = archetypeChunkChanges.CreatedSrcChunks.Chunks, CreatedChunkFlags = archetypeChunkChanges.CreatedSrcChunks.Flags, CreatedChunkEntityCounts = archetypeChunkChanges.CreatedSrcChunks.EntityCounts, DestroyedChunks = archetypeChunkChanges.DestroyedDstChunks.Chunks, DestroyedChunkFlags = archetypeChunkChanges.DestroyedDstChunks.Flags, DestroyedChunkEntityCounts = archetypeChunkChanges.DestroyedDstChunks.EntityCounts, }.Schedule(buildChunkSequenceNumberMap); jobHandle = srcChunksBySequenceNumber.Dispose(gatherArchetypeChunkChanges); return(archetypeChunkChanges); }
/// <summary> /// Builds high level chunk changes between the given chunk sets. /// /// Created chunks are from the srcWorld while destroyed chunks point to the dstWorld. /// </summary> /// <param name="srcChunks">A set of chunks from the srcWorld to consider.</param> /// <param name="dstChunks">A set of chunks from the dstWorld to consider.</param> /// <param name="dstChunkToSrcChunkSequenceNumbers">Mapping of sequence numbers for dstChunk to srcChunk.</param> /// <param name="allocator">The allocator that should be used for the returned structure.</param> /// <returns>A set of chunks which should have been created and/or destroyed from the srcWorld.</returns> public static unsafe ArchetypeChunkChanges GetArchetypeChunkChanges( NativeArray <ArchetypeChunk> srcChunks, NativeArray <ArchetypeChunk> dstChunks, Allocator allocator) { var createdEntityCount = 0; var destroyedEntityCount = 0; var createdChunks = new NativeList <ArchetypeChunk>(srcChunks.Length, allocator); var destroyedChunks = new NativeList <ArchetypeChunk>(dstChunks.Length, allocator); var createdChunkFlags = new NativeList <ChunkChangeFlags>(srcChunks.Length, allocator); var destroyedChunkFlags = new NativeList <ChunkChangeFlags>(dstChunks.Length, allocator); var createdChunksOffsets = new NativeArray <int>(srcChunks.Length, allocator, NativeArrayOptions.UninitializedMemory); var destroyedChunksOffsets = new NativeArray <int>(dstChunks.Length, allocator, NativeArrayOptions.UninitializedMemory); using (var srcChunksBySequenceNumber = new NativeHashMap <ulong, ArchetypeChunk>(srcChunks.Length, Allocator.TempJob)) using (var visitedChunks = new NativeHashMap <ulong, byte>(srcChunks.Length, Allocator.TempJob)) { var buildSrcChunkSequenceNumberMap = new BuildChunkSequenceNumberMap { Chunks = srcChunks, ChunksBySequenceNumber = srcChunksBySequenceNumber.AsParallelWriter() }.Schedule(srcChunks.Length, 64); var buildArchetypeChunkChanges = new BuildArchetypeChunkChanges { SrcChunks = srcChunks, DstChunks = dstChunks, SrcChunksBySequenceNumber = srcChunksBySequenceNumber, CreatedChunks = createdChunks, CreatedChunkFlags = createdChunkFlags, CreatedChunkOffsets = createdChunksOffsets, DestroyedChunks = destroyedChunks, DestroyedChunkFlags = destroyedChunkFlags, DestroyedChunkOffsets = destroyedChunksOffsets, VisitedChunks = visitedChunks, CreateEntityCount = &createdEntityCount, DestroyedEntityCount = &destroyedEntityCount }.Schedule(buildSrcChunkSequenceNumberMap); buildArchetypeChunkChanges.Complete(); } return(new ArchetypeChunkChanges( new ArchetypeChunkCollection(createdChunks, createdChunkFlags, createdChunksOffsets, createdEntityCount), new ArchetypeChunkCollection(destroyedChunks, destroyedChunkFlags, destroyedChunksOffsets, destroyedEntityCount))); }