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;
        }
示例#2
0
        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);
        }
示例#3
0
        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;
        }
示例#4
0
        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;
            }
        }
示例#5
0
        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);
        }
示例#6
0
        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;
            }
        }