예제 #1
0
        public EventBatch(EntityManager em, EventDefinition definition, Allocator allocator = Allocator.Persistent) : this()
        {
            var componentType  = ComponentType.FromTypeIndex(definition.ComponentTypeInfo.TypeIndex);
            var bufferType     = ComponentType.FromTypeIndex(definition.BufferTypeInfo.TypeIndex);
            var bufferLinkType = ComponentType.ReadWrite <BufferLink>();

            HasBuffer    = definition.BufferTypeInfo.TypeIndex != 0;
            HasComponent = definition.ComponentTypeInfo.TypeIndex != 0;

            var components = new List <ComponentType>()
            {
                definition.MetaType,
            };

            if (HasComponent)
            {
                components.AddRange(new[] {
                    componentType,
                });
            }

            if (HasBuffer)
            {
                components.AddRange(new[] {
                    bufferType,
                    bufferLinkType,
                });
            }

            Archetype = em.CreateArchetype(components.ToArray());

            var inactiveComponents = new List <ComponentType>(components)
            {
                ComponentType.ReadWrite <Disabled>()
            };

            InactiveArchetype = em.CreateArchetype(inactiveComponents.ToArray());


            Allocator          = allocator;
            ComponentType      = componentType;
            ComponentTypeIndex = definition.ComponentTypeInfo.TypeIndex;
            ComponentTypeSize  = definition.ComponentTypeInfo.SizeInChunk;

            BufferType             = bufferType;
            BufferTypeIndex        = definition.BufferTypeInfo.TypeIndex;
            BufferElementSize      = definition.BufferTypeInfo.ElementSize;
            BufferSizeInChunk      = definition.BufferTypeInfo.SizeInChunk;
            BufferAlignmentInBytes = definition.BufferTypeInfo.AlignmentInBytes;
            BufferLinkTypeIndex    = TypeManager.GetTypeIndex <BufferLink>();

            StartingPoolSize = definition.StartingPoolSize;

            ComponentQueue = new EventQueue(ComponentTypeIndex, ComponentTypeSize, BufferTypeIndex, BufferElementSize, allocator);
            Offsets        = GetChunkOffsets(em, Archetype, definition.MetaType, componentType, bufferType, bufferLinkType);

            ActiveChunks   = new ArchetypeView(Archetype);
            InactiveChunks = new ArchetypeView(InactiveArchetype);

            ActiveArchetypeChunks         = new UnsafeList(Allocator.Persistent);
            ActiveFullArchetypeChunks     = new UnsafeList(Allocator.Persistent);
            ActivePartialArchetypeChunk   = new UnsafeList(Allocator.Persistent);
            InactiveFullArchetypeChunks   = new UnsafeList(Allocator.Persistent);
            InactivePartialArchetypeChunk = new UnsafeList(Allocator.Persistent);

            if (definition.StartingPoolSize > 0)
            {
                CreateInactiveEntities(em, definition.StartingPoolSize);
                UpdateChunkCollections();
            }
        }