Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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)));
        }