public void SetChunkCount(Chunk *chunk, int newCount) { Assert.AreNotEqual(newCount, chunk->Count); var capacity = chunk->Capacity; // Chunk released to empty chunk pool if (newCount == 0) { // Remove references to shared components if (chunk->Archetype->NumSharedComponents > 0) { var sharedComponentValueArray = chunk->SharedComponentValueArray; for (var i = 0; i < chunk->Archetype->NumSharedComponents; ++i) { m_SharedComponentManager.RemoveReference(sharedComponentValueArray[i]); } } if (chunk->ManagedArrayIndex != -1) { DeallocateManagedArrayStorage(chunk->ManagedArrayIndex); chunk->ManagedArrayIndex = -1; } chunk->Archetype->ChunkCount -= 1; chunk->Archetype = null; chunk->ChunkListNode.Remove(); chunk->ChunkListWithEmptySlotsNode.Remove(); m_EmptyChunkPool->Add(&chunk->ChunkListNode); } // Chunk is now full else if (newCount == capacity) { chunk->ChunkListWithEmptySlotsNode.Remove(); } // Chunk is no longer full else if (chunk->Count == capacity) { Assert.IsTrue(newCount < chunk->Count); if (chunk->Archetype->NumSharedComponents == 0) { chunk->Archetype->ChunkListWithEmptySlots.Add(&chunk->ChunkListWithEmptySlotsNode); } else { chunk->Archetype->FreeChunksBySharedComponents.Add(chunk); } } chunk->Count = newCount; }
public void SetSharedComponentData <T>(Entity entity, T componentData) where T : struct, ISharedComponentData { BeforeStructuralChange(); var typeIndex = TypeManager.GetTypeIndex <T>(); m_Entities->AssertEntityHasComponent(entity, typeIndex); var newSharedComponentDataIndex = m_SharedComponentManager.InsertSharedComponent(componentData); m_Entities->SetSharedComponentDataIndex(m_ArchetypeManager, m_SharedComponentManager, entity, typeIndex, newSharedComponentDataIndex); m_SharedComponentManager.RemoveReference(newSharedComponentDataIndex); }
public void SetChunkCount(Chunk *chunk, int newCount) { Assert.AreNotEqual(newCount, chunk->Count); var capacity = chunk->Capacity; // Chunk released to empty chunk pool if (newCount == 0) { //@TODO: Support pooling when there are managed arrays... if (chunk->Archetype->NumManagedArrays == 0) { //Remove references to shared components if (chunk->Archetype->NumSharedComponents > 0) { var sharedComponentValueArray = chunk->SharedComponentValueArray; for (var i = 0; i < chunk->Archetype->NumSharedComponents; ++i) { m_SharedComponentManager.RemoveReference(sharedComponentValueArray[i]); } } chunk->Archetype = null; chunk->ChunkListNode.Remove(); chunk->ChunkListWithEmptySlotsNode.Remove(); m_EmptyChunkPool->Add(&chunk->ChunkListNode); } } // Chunk is now full else if (newCount == capacity) { chunk->ChunkListWithEmptySlotsNode.Remove(); } // Chunk is no longer full else if (chunk->Count == capacity) { Assert.IsTrue(newCount < chunk->Count); chunk->Archetype->ChunkListWithEmptySlots.Add(&chunk->ChunkListWithEmptySlotsNode); } chunk->Count = newCount; }
public unsafe void MoveSharedComponents(SharedComponentDataManager srcSharedComponents, int* sharedComponentIndices, int sharedComponentIndicesCount) { for (var i = 0; i != sharedComponentIndicesCount; i++) { var srcIndex = sharedComponentIndices[i]; if (srcIndex == 0) continue; var srcData = srcSharedComponents.m_SharedComponentData[srcIndex]; var typeIndex = srcSharedComponents.m_SharedComponentType[srcIndex]; var hashCode = TypeManager.GetHashCode(srcData, typeIndex); var dstIndex = InsertSharedComponentAssumeNonDefault(typeIndex, hashCode, srcData); srcSharedComponents.RemoveReference(srcIndex); sharedComponentIndices[i] = dstIndex; } }
public unsafe NativeArray <int> MoveSharedComponents(SharedComponentDataManager srcSharedComponents, NativeArray <ArchetypeChunk> chunks, Allocator allocator) { var remap = new NativeArray <int>(srcSharedComponents.GetSharedComponentCount(), allocator); for (int i = 0; i < chunks.Length; ++i) { var chunk = chunks[i].m_Chunk; var archetype = chunk->Archetype; for (int sharedComponentIndex = 0; sharedComponentIndex < archetype->NumSharedComponents; ++sharedComponentIndex) { remap[chunk->SharedComponentValueArray[sharedComponentIndex]]++; } } remap[0] = 0; for (int srcIndex = 1; srcIndex < remap.Length; ++srcIndex) { if (remap[srcIndex] == 0) { continue; } var srcData = srcSharedComponents.m_SharedComponentData[srcIndex]; var typeIndex = srcSharedComponents.m_SharedComponentType[srcIndex]; var typeInfo = TypeManager.GetTypeInfo(typeIndex).FastEqualityTypeInfo; var hashCode = GetHashCodeFast(srcData, typeInfo); var dstIndex = InsertSharedComponentAssumeNonDefault(typeIndex, hashCode, srcData, typeInfo); m_SharedComponentRefCount[dstIndex] += remap[srcIndex] - 1; srcSharedComponents.RemoveReference(srcIndex, remap[srcIndex]); remap[srcIndex] = dstIndex; } return(remap); }
unsafe public void MoveSharedComponents(SharedComponentDataManager srcSharedComponents, int *sharedComponentIndices, int sharedComponentIndicesCount) { for (int i = 0; i != sharedComponentIndicesCount; i++) { int srcIndex = sharedComponentIndices[i]; if (srcIndex == 0) { continue; } var srcData = srcSharedComponents.m_SharedComponentData[srcIndex]; int typeIndex = srcSharedComponents.m_SharedComponentType[srcIndex]; var fastLayout = TypeManager.GetComponentType(typeIndex).FastEqualityLayout; var hashCode = GetHashCodeFast(srcData, fastLayout); int dstIndex = InsertSharedComponentAssumeNonDefault(typeIndex, hashCode, srcData, fastLayout); srcSharedComponents.RemoveReference(srcIndex); sharedComponentIndices[i] = dstIndex; } }