public static void MoveChunks( NativeArray <ArchetypeChunk> chunks, NativeArray <EntityRemapUtility.EntityRemapInfo> entityRemapping, EntityComponentStore *srcEntityComponentStore, ManagedComponentStore srcManagedComponentStore, EntityComponentStore *dstEntityComponentStore, ManagedComponentStore dstManagedComponentStore) { new MoveChunksJob { srcEntityComponentStore = srcEntityComponentStore, dstEntityComponentStore = dstEntityComponentStore, entityRemapping = entityRemapping, chunks = chunks }.Run(); int chunkCount = chunks.Length; var remapChunks = new NativeArray <RemapChunk>(chunkCount, Allocator.TempJob); for (int i = 0; i < chunkCount; ++i) { var chunk = chunks[i].m_Chunk; var archetype = chunk->Archetype; //TODO: this should not be done more than once for each archetype var dstArchetype = EntityManagerCreateArchetypeUtility.GetOrCreateArchetype(archetype->Types, archetype->TypesCount, dstEntityComponentStore); remapChunks[i] = new RemapChunk { chunk = chunk, dstArchetype = dstArchetype }; chunk->SequenceNumber = dstEntityComponentStore->AssignSequenceNumber(chunk); if (archetype->MetaChunkArchetype != null) { Entity srcEntity = chunk->metaChunkEntity; Entity dstEntity; EntityManagerCreateDestroyEntitiesUtility.CreateEntities(dstArchetype->MetaChunkArchetype, &dstEntity, 1, dstEntityComponentStore, dstManagedComponentStore); srcEntityComponentStore->GetChunk(srcEntity, out var srcChunk, out var srcIndex); dstEntityComponentStore->GetChunk(dstEntity, out var dstChunk, out var dstIndex); ChunkDataUtility.SwapComponents(srcChunk, srcIndex, dstChunk, dstIndex, 1, srcEntityComponentStore->GlobalSystemVersion, dstEntityComponentStore->GlobalSystemVersion); EntityRemapUtility.AddEntityRemapping(ref entityRemapping, srcEntity, dstEntity); EntityManagerCreateDestroyEntitiesUtility.DestroyEntities(&srcEntity, 1, srcEntityComponentStore, srcManagedComponentStore); } } k_ProfileMoveSharedComponents.Begin(); var remapShared = dstManagedComponentStore.MoveSharedComponents(srcManagedComponentStore, chunks, entityRemapping, Allocator.TempJob); k_ProfileMoveSharedComponents.End(); var remapChunksJob = new RemapChunksJob { dstEntityComponentStore = dstEntityComponentStore, remapChunks = remapChunks, entityRemapping = entityRemapping }.Schedule(remapChunks.Length, 1); var moveChunksBetweenArchetypeJob = new MoveChunksBetweenArchetypeJob { remapChunks = remapChunks, remapShared = remapShared, globalSystemVersion = dstEntityComponentStore->GlobalSystemVersion }.Schedule(remapChunksJob); moveChunksBetweenArchetypeJob.Complete(); remapShared.Dispose(); remapChunks.Dispose(); }
public static void MoveChunks(EntityManager srcEntities, ArchetypeManager dstArchetypeManager, EntityGroupManager dstGroupManager, EntityDataManager *dstEntityDataManager, SharedComponentDataManager dstSharedComponents) { var srcArchetypeManager = srcEntities.ArchetypeManager; var srcEntityDataManager = srcEntities.Entities; var srcSharedComponents = srcEntities.m_SharedComponentManager; var entityRemapping = new NativeArray <EntityRemapUtility.EntityRemapInfo>(srcEntityDataManager->Capacity, Allocator.Temp); dstEntityDataManager->AllocateEntitiesForRemapping(srcEntityDataManager, ref entityRemapping); srcEntityDataManager->FreeAllEntities(); var samplerShared = CustomSampler.Create("MoveAllSharedComponents"); samplerShared.Begin(); var remapShared = dstSharedComponents.MoveAllSharedComponents(srcSharedComponents, Allocator.Temp); samplerShared.End(); Archetype *srcArchetype; int chunkCount = 0; int archetypeCount = 0; srcArchetype = srcArchetypeManager.m_LastArchetype; while (srcArchetype != null) { archetypeCount++; chunkCount += srcArchetype->ChunkCount; srcArchetype = srcArchetype->PrevArchetype; } var remapChunks = new NativeArray <RemapChunk>(chunkCount, Allocator.Temp); var remapArchetypes = new NativeArray <RemapArchetype>(archetypeCount, Allocator.Temp); int chunkIndex = 0; int archetypeIndex = 0; srcArchetype = srcArchetypeManager.m_LastArchetype; while (srcArchetype != null) { if (srcArchetype->ChunkCount != 0) { if (srcArchetype->NumManagedArrays != 0) { throw new ArgumentException("MoveEntitiesFrom is not supported with managed arrays"); } var dstArchetype = dstArchetypeManager.GetOrCreateArchetype(srcArchetype->Types, srcArchetype->TypesCount, dstGroupManager); remapArchetypes[archetypeIndex] = new RemapArchetype { srcArchetype = srcArchetype, dstArchetype = dstArchetype }; for (var c = srcArchetype->ChunkList.Begin; c != srcArchetype->ChunkList.End; c = c->Next) { remapChunks[chunkIndex] = new RemapChunk { chunk = (Chunk *)c, dstArchetype = dstArchetype }; chunkIndex++; } archetypeIndex++; dstEntityDataManager->IncrementComponentTypeOrderVersion(dstArchetype); } srcArchetype = srcArchetype->PrevArchetype; } for (int j = 0; j < remapChunks.Length; j++) { ref RemapChunk remapChunk = ref UnsafeUtilityEx.ArrayElementAsRef <RemapChunk>(remapChunks.GetUnsafePtr(), j); ref Chunk * chunk = ref remapChunk.chunk;
public static void MoveChunks( NativeArray <EntityRemapUtility.EntityRemapInfo> entityRemapping, EntityComponentStore *srcEntityComponentStore, ManagedComponentStore srcManagedComponentStore, EntityComponentStore *dstEntityComponentStore, ManagedComponentStore dstManagedComponentStore) { var moveChunksJob = new MoveAllChunksJob { srcEntityComponentStore = srcEntityComponentStore, dstEntityComponentStore = dstEntityComponentStore, entityRemapping = entityRemapping }.Schedule(); JobHandle.ScheduleBatchedJobs(); int chunkCount = 0; for (var i = srcEntityComponentStore->m_Archetypes.Count - 1; i >= 0; --i) { var srcArchetype = srcEntityComponentStore->m_Archetypes.p[i]; chunkCount += srcArchetype->Chunks.Count; } var remapChunks = new NativeArray <RemapChunk>(chunkCount, Allocator.TempJob); var remapArchetypes = new NativeArray <RemapArchetype>(srcEntityComponentStore->m_Archetypes.Count, Allocator.TempJob); int chunkIndex = 0; int archetypeIndex = 0; for (var i = srcEntityComponentStore->m_Archetypes.Count - 1; i >= 0; --i) { var srcArchetype = srcEntityComponentStore->m_Archetypes.p[i]; if (srcArchetype->Chunks.Count != 0) { if (srcArchetype->NumManagedArrays != 0) { throw new ArgumentException("MoveEntitiesFrom is not supported with managed arrays"); } var dstArchetype = EntityManagerCreateArchetypeUtility.GetOrCreateArchetype(srcArchetype->Types, srcArchetype->TypesCount, dstEntityComponentStore); remapArchetypes[archetypeIndex] = new RemapArchetype { srcArchetype = srcArchetype, dstArchetype = dstArchetype }; for (var j = 0; j < srcArchetype->Chunks.Count; ++j) { var srcChunk = srcArchetype->Chunks.p[j]; remapChunks[chunkIndex] = new RemapChunk { chunk = srcChunk, dstArchetype = dstArchetype }; chunkIndex++; } archetypeIndex++; dstEntityComponentStore->IncrementComponentTypeOrderVersion(dstArchetype); } } moveChunksJob.Complete(); k_ProfileMoveSharedComponents.Begin(); var remapShared = dstManagedComponentStore.MoveAllSharedComponents(srcManagedComponentStore, Allocator.TempJob); k_ProfileMoveSharedComponents.End(); var remapAllChunksJob = new RemapAllChunksJob { dstEntityComponentStore = dstEntityComponentStore, remapChunks = remapChunks, entityRemapping = entityRemapping }.Schedule(remapChunks.Length, 1); var remapArchetypesJob = new RemapArchetypesJob { remapArchetypes = remapArchetypes, remapShared = remapShared, dstEntityComponentStore = dstEntityComponentStore, chunkHeaderType = TypeManager.GetTypeIndex <ChunkHeader>() }.Schedule(archetypeIndex, 1, remapAllChunksJob); remapArchetypesJob.Complete(); remapShared.Dispose(); remapChunks.Dispose(); }
internal void MoveChunksFromAll( NativeArray <EntityRemapUtility.EntityRemapInfo> entityRemapping, EntityComponentStore *srcEntityComponentStore, ManagedComponentStore srcManagedComponentStore) { var access = GetCheckedEntityDataAccess(); var ecs = access->EntityComponentStore; var mcs = access->ManagedComponentStore; var moveChunksJob = new MoveAllChunksJob { srcEntityComponentStore = srcEntityComponentStore, dstEntityComponentStore = ecs, entityRemapping = entityRemapping }.Schedule(); int managedComponentCount = srcEntityComponentStore->ManagedComponentIndexUsedCount; NativeArray <int> srcManagedIndices = default; NativeArray <int> dstManagedIndices = default; JobHandle gatherManagedComponentIndices = default; if (managedComponentCount > 0) { srcManagedIndices = new NativeArray <int>(managedComponentCount, Allocator.TempJob); dstManagedIndices = new NativeArray <int>(managedComponentCount, Allocator.TempJob); ecs->ReserveManagedComponentIndices(managedComponentCount); gatherManagedComponentIndices = new GatherAllManagedComponentIndicesJob { SrcEntityComponentStore = srcEntityComponentStore, DstEntityComponentStore = ecs, SrcManagedIndices = srcManagedIndices, DstManagedIndices = dstManagedIndices }.Schedule(); } JobHandle.ScheduleBatchedJobs(); int chunkCount = 0; for (var i = 0; i < srcEntityComponentStore->m_Archetypes.Length; ++i) { var srcArchetype = srcEntityComponentStore->m_Archetypes.Ptr[i]; chunkCount += srcArchetype->Chunks.Count; } var remapChunks = new NativeArray <RemapChunk>(chunkCount, Allocator.TempJob); var remapArchetypes = new NativeArray <RemapArchetype>(srcEntityComponentStore->m_Archetypes.Length, Allocator.TempJob); int chunkIndex = 0; int archetypeIndex = 0; for (var i = 0; i < srcEntityComponentStore->m_Archetypes.Length; ++i) { var srcArchetype = srcEntityComponentStore->m_Archetypes.Ptr[i]; if (srcArchetype->Chunks.Count != 0) { var dstArchetype = ecs->GetOrCreateArchetype(srcArchetype->Types, srcArchetype->TypesCount); remapArchetypes[archetypeIndex] = new RemapArchetype { srcArchetype = srcArchetype, dstArchetype = dstArchetype }; for (var j = 0; j < srcArchetype->Chunks.Count; ++j) { var srcChunk = srcArchetype->Chunks.p[j]; remapChunks[chunkIndex] = new RemapChunk { chunk = srcChunk, dstArchetype = dstArchetype }; chunkIndex++; } archetypeIndex++; ecs->IncrementComponentTypeOrderVersion(dstArchetype); } } moveChunksJob.Complete(); mcs.Playback(ref ecs->ManagedChangesTracker); srcManagedComponentStore.Playback(ref srcEntityComponentStore->ManagedChangesTracker); k_ProfileMoveSharedComponents.Begin(); var remapShared = mcs.MoveAllSharedComponents(srcManagedComponentStore, Allocator.TempJob); k_ProfileMoveSharedComponents.End(); gatherManagedComponentIndices.Complete(); k_ProfileMoveManagedComponents.Begin(); mcs.MoveManagedComponentsFromDifferentWorld(srcManagedIndices, dstManagedIndices, srcManagedIndices.Length, srcManagedComponentStore); srcEntityComponentStore->m_ManagedComponentFreeIndex.Length = 0; srcEntityComponentStore->m_ManagedComponentIndex = 1; k_ProfileMoveManagedComponents.End(); new ChunkPatchEntities { RemapChunks = remapChunks, EntityRemapping = entityRemapping, EntityComponentStore = ecs }.Run(); var remapAllChunksJob = new RemapAllChunksJob { dstEntityComponentStore = ecs, remapChunks = remapChunks, entityRemapping = entityRemapping }.Schedule(remapChunks.Length, 1); var remapArchetypesJob = new RemapAllArchetypesJob { remapArchetypes = remapArchetypes, remapShared = remapShared, dstEntityComponentStore = ecs, chunkHeaderType = TypeManager.GetTypeIndex <ChunkHeader>() }.Schedule(archetypeIndex, 1, remapAllChunksJob); mcs.Playback(ref ecs->ManagedChangesTracker); if (managedComponentCount > 0) { srcManagedIndices.Dispose(); dstManagedIndices.Dispose(); } remapArchetypesJob.Complete(); remapShared.Dispose(); remapChunks.Dispose(); }
internal void MoveChunksFromFiltered( NativeArray <ArchetypeChunk> chunks, NativeArray <EntityRemapUtility.EntityRemapInfo> entityRemapping, EntityComponentStore *srcEntityComponentStore, ManagedComponentStore srcManagedComponentStore) { var access = GetCheckedEntityDataAccess(); var ecs = access->EntityComponentStore; var mcs = access->ManagedComponentStore; new MoveChunksJob { srcEntityComponentStore = srcEntityComponentStore, dstEntityComponentStore = ecs, entityRemapping = entityRemapping, chunks = chunks }.Run(); int chunkCount = chunks.Length; var remapChunks = new NativeArray <RemapChunk>(chunkCount, Allocator.TempJob); Archetype *previousSrcArchetypee = null; Archetype *dstArchetype = null; int managedComponentCount = 0; NativeList <IntPtr> managedChunks = new NativeList <IntPtr>(0, Allocator.TempJob); for (int i = 0; i < chunkCount; ++i) { var chunk = chunks[i].m_Chunk; var archetype = chunk->Archetype; // Move Chunk World. ChangeVersion:Yes OrderVersion:Yes if (previousSrcArchetypee != archetype) { dstArchetype = ecs->GetOrCreateArchetype(archetype->Types, archetype->TypesCount); } remapChunks[i] = new RemapChunk { chunk = chunk, dstArchetype = dstArchetype }; if (dstArchetype->NumManagedComponents > 0) { managedComponentCount += chunk->Count * dstArchetype->NumManagedComponents; managedChunks.Add((IntPtr)chunk); } if (archetype->MetaChunkArchetype != null) { Entity srcEntity = chunk->metaChunkEntity; Entity dstEntity; ecs->CreateEntities(dstArchetype->MetaChunkArchetype, &dstEntity, 1); var srcEntityInChunk = srcEntityComponentStore->GetEntityInChunk(srcEntity); var dstEntityInChunk = ecs->GetEntityInChunk(dstEntity); ChunkDataUtility.SwapComponents(srcEntityInChunk.Chunk, srcEntityInChunk.IndexInChunk, dstEntityInChunk.Chunk, dstEntityInChunk.IndexInChunk, 1, srcEntityComponentStore->GlobalSystemVersion, ecs->GlobalSystemVersion); EntityRemapUtility.AddEntityRemapping(ref entityRemapping, srcEntity, dstEntity); srcEntityComponentStore->DestroyEntities(&srcEntity, 1); } } NativeArray <int> srcManagedIndices = default; NativeArray <int> dstManagedIndices = default; int nonNullManagedComponentCount = 0; if (managedComponentCount > 0) { srcManagedIndices = new NativeArray <int>(managedComponentCount, Allocator.TempJob); dstManagedIndices = new NativeArray <int>(managedComponentCount, Allocator.TempJob); new GatherManagedComponentIndicesInChunkJob() { SrcEntityComponentStore = srcEntityComponentStore, DstEntityComponentStore = ecs, SrcManagedIndices = srcManagedIndices, DstManagedIndices = dstManagedIndices, Chunks = managedChunks, NonNullCount = &nonNullManagedComponentCount }.Run(); } mcs.Playback(ref ecs->ManagedChangesTracker); srcManagedComponentStore.Playback(ref srcEntityComponentStore->ManagedChangesTracker); k_ProfileMoveSharedComponents.Begin(); var remapShared = mcs.MoveSharedComponents(srcManagedComponentStore, chunks, Allocator.TempJob); k_ProfileMoveSharedComponents.End(); if (managedComponentCount > 0) { k_ProfileMoveManagedComponents.Begin(); mcs.MoveManagedComponentsFromDifferentWorld(srcManagedIndices, dstManagedIndices, nonNullManagedComponentCount, srcManagedComponentStore); srcEntityComponentStore->m_ManagedComponentFreeIndex.Add(srcManagedIndices.GetUnsafeReadOnlyPtr(), sizeof(int) * srcManagedIndices.Length); k_ProfileMoveManagedComponents.End(); } new ChunkPatchEntities { RemapChunks = remapChunks, EntityRemapping = entityRemapping, EntityComponentStore = ecs }.Run(); var remapChunksJob = new RemapChunksFilteredJob { dstEntityComponentStore = ecs, remapChunks = remapChunks, entityRemapping = entityRemapping, chunkHeaderType = TypeManager.GetTypeIndex <ChunkHeader>() }.Schedule(remapChunks.Length, 1); var moveChunksBetweenArchetypeJob = new MoveFilteredChunksBetweenArchetypexJob { RemapChunks = remapChunks, RemapShared = remapShared, GlobalSystemVersion = ecs->GlobalSystemVersion }.Schedule(remapChunksJob); moveChunksBetweenArchetypeJob.Complete(); mcs.Playback(ref ecs->ManagedChangesTracker); if (managedComponentCount > 0) { srcManagedIndices.Dispose(); dstManagedIndices.Dispose(); } managedChunks.Dispose(); remapShared.Dispose(); remapChunks.Dispose(); }
public static void MoveChunks(EntityManager srcEntities, ArchetypeManager dstArchetypeManager, EntityGroupManager dstGroupManager, EntityDataManager *dstEntityDataManager, SharedComponentDataManager dstSharedComponents, ComponentTypeInArchetype *componentTypeInArchetypeArray) { var srcArchetypeManager = srcEntities.ArchetypeManager; var srcEntityDataManager = srcEntities.Entities; var srcSharedComponents = srcEntities.m_SharedComponentManager; var entityRemapping = new NativeArray <EntityRemapUtility.EntityRemapInfo>(srcEntityDataManager->Capacity, Allocator.TempJob); var moveChunksJob = new MoveChunksJob { srcEntityDataManager = srcEntityDataManager, dstEntityDataManager = dstEntityDataManager, entityRemapping = entityRemapping }.Schedule(); JobHandle.ScheduleBatchedJobs(); var samplerShared = CustomSampler.Create("MoveAllSharedComponents"); samplerShared.Begin(); var remapShared = dstSharedComponents.MoveAllSharedComponents(srcSharedComponents, Allocator.TempJob); samplerShared.End(); Archetype *srcArchetype; int chunkCount = 0; int archetypeCount = 0; srcArchetype = srcArchetypeManager.m_LastArchetype; while (srcArchetype != null) { archetypeCount++; chunkCount += srcArchetype->ChunkCount; srcArchetype = srcArchetype->PrevArchetype; } var remapChunks = new NativeArray <RemapChunk>(chunkCount, Allocator.TempJob); var remapArchetypes = new NativeArray <RemapArchetype>(archetypeCount, Allocator.TempJob); int chunkIndex = 0; int archetypeIndex = 0; srcArchetype = srcArchetypeManager.m_LastArchetype; while (srcArchetype != null) { if (srcArchetype->ChunkCount != 0) { if (srcArchetype->NumManagedArrays != 0) { throw new ArgumentException("MoveEntitiesFrom is not supported with managed arrays"); } // Make copy. GetOrCreateArchetype writes to type array. UnsafeUtility.MemCpy(componentTypeInArchetypeArray, srcArchetype->Types, UnsafeUtility.SizeOf <ComponentTypeInArchetype>() * srcArchetype->TypesCount); var dstArchetype = dstArchetypeManager.GetOrCreateArchetype(componentTypeInArchetypeArray, srcArchetype->TypesCount, dstGroupManager); remapArchetypes[archetypeIndex] = new RemapArchetype { srcArchetype = srcArchetype, dstArchetype = dstArchetype }; for (var c = srcArchetype->ChunkList.Begin; c != srcArchetype->ChunkList.End; c = c->Next) { remapChunks[chunkIndex] = new RemapChunk { chunk = (Chunk *)c, dstArchetype = dstArchetype }; chunkIndex++; } archetypeIndex++; dstEntityDataManager->IncrementComponentTypeOrderVersion(dstArchetype); } srcArchetype = srcArchetype->PrevArchetype; } var remapChunksJob = new RemapChunksJob { dstEntityDataManager = dstEntityDataManager, remapChunks = remapChunks, remapShared = remapShared, entityRemapping = entityRemapping }.Schedule(remapChunks.Length, 1, moveChunksJob); var remapArchetypesJob = new RemapArchetypesJob { remapArchetypes = remapArchetypes }.Schedule(archetypeIndex, 1, remapChunksJob); remapArchetypesJob.Complete(); entityRemapping.Dispose(); remapShared.Dispose(); }
internal void MoveChunksFrom( NativeArray <EntityRemapUtility.EntityRemapInfo> entityRemapping, EntityComponentStore *srcEntityComponentStore, ManagedComponentStore srcManagedComponentStore) { var moveChunksJob = new MoveAllChunksJob { srcEntityComponentStore = srcEntityComponentStore, dstEntityComponentStore = EntityComponentStore, entityRemapping = entityRemapping }.Schedule(); JobHandle.ScheduleBatchedJobs(); int chunkCount = 0; for (var i = 0; i < srcEntityComponentStore->m_Archetypes.Length; ++i) { var srcArchetype = srcEntityComponentStore->m_Archetypes.Ptr[i]; chunkCount += srcArchetype->Chunks.Count; } var remapChunks = new NativeArray <RemapChunk>(chunkCount, Allocator.TempJob); var remapArchetypes = new NativeArray <RemapArchetype>(srcEntityComponentStore->m_Archetypes.Length, Allocator.TempJob); var managedArrayChunks = new NativeList <IntPtr>(Allocator.Temp); int chunkIndex = 0; int archetypeIndex = 0; for (var i = 0; i < srcEntityComponentStore->m_Archetypes.Length; ++i) { var srcArchetype = srcEntityComponentStore->m_Archetypes.Ptr[i]; if (srcArchetype->Chunks.Count != 0) { var dstArchetype = EntityComponentStore->GetOrCreateArchetype(srcArchetype->Types, srcArchetype->TypesCount); remapArchetypes[archetypeIndex] = new RemapArchetype { srcArchetype = srcArchetype, dstArchetype = dstArchetype }; for (var j = 0; j < srcArchetype->Chunks.Count; ++j) { var srcChunk = srcArchetype->Chunks.p[j]; remapChunks[chunkIndex] = new RemapChunk { chunk = srcChunk, dstArchetype = dstArchetype }; chunkIndex++; } if (srcArchetype->NumManagedArrays > 0) { for (var j = 0; j < srcArchetype->Chunks.Count; ++j) { var chunk = srcArchetype->Chunks.p[j]; managedArrayChunks.Add((IntPtr)chunk); } } archetypeIndex++; EntityComponentStore->IncrementComponentTypeOrderVersion(dstArchetype); } } moveChunksJob.Complete(); var managedArrayDstIndices = new NativeArray <int>(managedArrayChunks.Length, Allocator.TempJob); var managedArraySrcIndices = new NativeArray <int>(managedArrayChunks.Length, Allocator.TempJob); EntityComponentStore->ReserveManagedObjectArrays(managedArrayDstIndices); var remapManaged = new RemapManagedArraysJob { chunks = managedArrayChunks, dstIndices = managedArrayDstIndices, srcIndices = managedArraySrcIndices, }.Schedule(managedArrayChunks.Length, 64); ManagedComponentStore.Playback(ref EntityComponentStore->ManagedChangesTracker); srcManagedComponentStore.Playback(ref srcEntityComponentStore->ManagedChangesTracker); k_ProfileMoveObjectComponents.Begin(); remapManaged.Complete(); m_ManagedComponentStore.MoveManagedObjectArrays(managedArraySrcIndices, managedArrayDstIndices, srcManagedComponentStore); k_ProfileMoveObjectComponents.End(); managedArrayDstIndices.Dispose(); managedArraySrcIndices.Dispose(); managedArrayChunks.Dispose(); k_ProfileMoveSharedComponents.Begin(); var remapShared = ManagedComponentStore.MoveAllSharedComponents(srcManagedComponentStore, Allocator.TempJob); k_ProfileMoveSharedComponents.End(); new ChunkPatchEntities { RemapChunks = remapChunks, EntityRemapping = entityRemapping, EntityComponentStore = EntityComponentStore }.Run(); var remapAllChunksJob = new RemapAllChunksJob { dstEntityComponentStore = EntityComponentStore, remapChunks = remapChunks, entityRemapping = entityRemapping }.Schedule(remapChunks.Length, 1); var remapArchetypesJob = new RemapArchetypesJob { remapArchetypes = remapArchetypes, remapShared = remapShared, dstEntityComponentStore = EntityComponentStore, chunkHeaderType = TypeManager.GetTypeIndex <ChunkHeader>() }.Schedule(archetypeIndex, 1, remapAllChunksJob); ManagedComponentStore.Playback(ref EntityComponentStore->ManagedChangesTracker); remapArchetypesJob.Complete(); remapShared.Dispose(); remapChunks.Dispose(); }
internal void MoveChunksFrom( NativeArray <ArchetypeChunk> chunks, NativeArray <EntityRemapUtility.EntityRemapInfo> entityRemapping, EntityComponentStore *srcEntityComponentStore, ManagedComponentStore srcManagedComponentStore) { new MoveChunksJob { srcEntityComponentStore = srcEntityComponentStore, dstEntityComponentStore = EntityComponentStore, entityRemapping = entityRemapping, chunks = chunks }.Run(); var managedArrayChunks = new NativeList <IntPtr>(Allocator.Temp); int chunkCount = chunks.Length; var remapChunks = new NativeArray <RemapChunk>(chunkCount, Allocator.TempJob); for (int i = 0; i < chunkCount; ++i) { var chunk = chunks[i].m_Chunk; var archetype = chunk->Archetype; //TODO: this should not be done more than once for each archetype var dstArchetype = EntityComponentStore->GetOrCreateArchetype(archetype->Types, archetype->TypesCount); remapChunks[i] = new RemapChunk { chunk = chunk, dstArchetype = dstArchetype }; if (archetype->NumManagedArrays > 0) { managedArrayChunks.Add((IntPtr)chunk); } if (archetype->MetaChunkArchetype != null) { Entity srcEntity = chunk->metaChunkEntity; Entity dstEntity; EntityComponentStore->CreateEntities(dstArchetype->MetaChunkArchetype, &dstEntity, 1); var srcEntityInChunk = srcEntityComponentStore->GetEntityInChunk(srcEntity); var dstEntityInChunk = EntityComponentStore->GetEntityInChunk(dstEntity); ChunkDataUtility.SwapComponents(srcEntityInChunk.Chunk, srcEntityInChunk.IndexInChunk, dstEntityInChunk.Chunk, dstEntityInChunk.IndexInChunk, 1, srcEntityComponentStore->GlobalSystemVersion, EntityComponentStore->GlobalSystemVersion); EntityRemapUtility.AddEntityRemapping(ref entityRemapping, srcEntity, dstEntity); srcEntityComponentStore->DestroyEntities(&srcEntity, 1); } } var managedArrayDstIndices = new NativeArray <int>(managedArrayChunks.Length, Allocator.TempJob); var managedArraySrcIndices = new NativeArray <int>(managedArrayChunks.Length, Allocator.TempJob); EntityComponentStore->ReserveManagedObjectArrays(managedArrayDstIndices); var remapManaged = new RemapManagedArraysJob { chunks = managedArrayChunks, dstIndices = managedArrayDstIndices, srcIndices = managedArraySrcIndices, }.Schedule(managedArrayChunks.Length, 64); ManagedComponentStore.Playback(ref EntityComponentStore->ManagedChangesTracker); srcManagedComponentStore.Playback(ref srcEntityComponentStore->ManagedChangesTracker); k_ProfileMoveObjectComponents.Begin(); remapManaged.Complete(); m_ManagedComponentStore.MoveManagedObjectArrays(managedArraySrcIndices, managedArrayDstIndices, srcManagedComponentStore); k_ProfileMoveObjectComponents.End(); managedArrayDstIndices.Dispose(); managedArraySrcIndices.Dispose(); managedArrayChunks.Dispose(); k_ProfileMoveSharedComponents.Begin(); var remapShared = ManagedComponentStore.MoveSharedComponents(srcManagedComponentStore, chunks, Allocator.TempJob); k_ProfileMoveSharedComponents.End(); new ChunkPatchEntities { RemapChunks = remapChunks, EntityRemapping = entityRemapping, EntityComponentStore = EntityComponentStore }.Run(); var remapChunksJob = new RemapChunksJob { dstEntityComponentStore = EntityComponentStore, remapChunks = remapChunks, entityRemapping = entityRemapping }.Schedule(remapChunks.Length, 1); var moveChunksBetweenArchetypeJob = new MoveChunksBetweenArchetypeJob { remapChunks = remapChunks, remapShared = remapShared, globalSystemVersion = EntityComponentStore->GlobalSystemVersion }.Schedule(remapChunksJob); moveChunksBetweenArchetypeJob.Complete(); ManagedComponentStore.Playback(ref EntityComponentStore->ManagedChangesTracker); remapShared.Dispose(); remapChunks.Dispose(); }