示例#1
0
        internal void Dispose()
        {
#if ENABLE_UNITY_COLLECTIONS_CHECKS
            AtomicSafetyHandle.CheckDeallocateAndThrow(m_Safety);
#endif
            if (m_Data != null)
            {
                EntitySharedComponentCommand *cleanup_list = m_Data->m_CleanupList;
                while (cleanup_list != null)
                {
                    cleanup_list->BoxedObject.Free();
                    cleanup_list = cleanup_list->Prev;
                }
                m_Data->m_CleanupList = null;

                var label = m_Data->m_Allocator;

                while (m_Data->m_Tail != null)
                {
                    var prev = m_Data->m_Tail->Prev;
                    UnsafeUtility.Free(m_Data->m_Tail, m_Data->m_Allocator);
                    m_Data->m_Tail = prev;
                }

                m_Data->m_Head = null;
                UnsafeUtility.Free(m_Data, label);
                m_Data = null;
            }
        }
示例#2
0
        internal unsafe void AddEntitySharedComponentCommand <T>(EntityCommandBufferChain *chain, int jobIndex, ECBCommand op, Entity e, int hashCode, object boxedObject) where T : struct
        {
            int size = Align(sizeof(EntitySharedComponentCommand), 8);
            EntitySharedComponentCommand *commandPtr = (EntitySharedComponentCommand *)ref this.Reserve(chain, jobIndex, size);

            commandPtr->Header.Header.CommandType = (int)op;
            commandPtr->Header.Header.TotalSize   = size;
            commandPtr->Header.Header.SortIndex   = chain.m_LastSortIndex;
            commandPtr->Header.Entity             = e;
            commandPtr->ComponentTypeIndex        = TypeManager.GetTypeIndex <T>();
            commandPtr->HashCode = hashCode;
            if (boxedObject == null)
            {
                commandPtr->BoxedObject = new GCHandle();
            }
            else
            {
                commandPtr->BoxedObject = GCHandle.Alloc(boxedObject);
                commandPtr->Prev        = chain.m_CleanupList;
                chain.m_CleanupList     = commandPtr;
            }
        }