Exemple #1
0
        public void TestApplyAndReadEmptyData()
        {
            var entity1 = m_Manager.CreateEntity(typeof(PersistenceState), typeof(EmptyEcsPersistingTestData));
            var entity2 = m_Manager.CreateEntity(typeof(PersistenceState));
            var entity3 = m_Manager.CreateEntity(typeof(PersistenceState), typeof(EmptyEcsPersistingTestData));

            m_Manager.SetComponentData(entity1, new PersistenceState {
                ArrayIndex = 0
            });
            m_Manager.SetComponentData(entity2, new PersistenceState {
                ArrayIndex = 1
            });
            m_Manager.SetComponentData(entity3, new PersistenceState {
                ArrayIndex = 2
            });

            var query = m_Manager.CreateEntityQuery(typeof(PersistenceState));
            var data  = new NativeArray <byte>(3 * PersistenceMetaData.SizeOfStruct, Allocator.TempJob);

            // Action
            var readJob = new CopyComponentDataToByteArray()
            {
                PersistenceStateType = m_Manager.GetComponentTypeHandle <PersistenceState>(true),
                RawContainerData     = data,
                SubArrayOffset       = 0,
                SubArrayByteSize     = data.Length,
                TypeSize             = 0,
                ComponentTypeHandle  = m_Manager.GetDynamicComponentTypeHandle(typeof(EmptyEcsPersistingTestData))
            }.Schedule(query);

            readJob.Complete();

            m_Manager.AddComponentData(entity2, new EmptyEcsPersistingTestData());
            m_Manager.RemoveComponent <EmptyEcsPersistingTestData>(entity3);

            using (EntityCommandBuffer cmds = new EntityCommandBuffer(Allocator.TempJob))
            {
                var removeJob = new CopyByteArrayToComponentData()
                {
                    ComponentType        = typeof(EmptyEcsPersistingTestData),
                    TypeSize             = TypeManager.GetTypeInfo <EmptyEcsPersistingTestData>().ElementSize,
                    PersistenceStateType = m_Manager.GetComponentTypeHandle <PersistenceState>(true),
                    RawContainerData     = data,
                    SubArrayOffset       = 0,
                    SubArrayByteSize     = data.Length,
                    EntityType           = m_Manager.GetEntityTypeHandle(),
                    Ecb = cmds.AsParallelWriter(),
                    ComponentTypeHandle = m_Manager.GetDynamicComponentTypeHandle(typeof(EmptyEcsPersistingTestData))
                }.Schedule(query);
                removeJob.Complete();
                cmds.Playback(m_Manager);
            }

            // Check Results
            Assert.True(m_Manager.HasComponent <EmptyEcsPersistingTestData>(entity1), "The entity does not have the component EmptyEcsPersistingTestData BUT the entity did have the component at the time of persisting.");
            Assert.False(m_Manager.HasComponent <EmptyEcsPersistingTestData>(entity2), "The entity has the component EmptyEcsPersistingTestData BUT the entity did not have the component at the time of persisting.");
            Assert.True(m_Manager.HasComponent <EmptyEcsPersistingTestData>(entity3), "The entity does not have the component EmptyEcsPersistingTestData BUT the entity did have the component at the time of persisting.");

            // Cleanup
            data.Dispose();
            m_Manager.DestroyEntity(m_Manager.CreateEntityQuery(typeof(PersistenceState)));
        }
Exemple #2
0
        public unsafe void TestReadComponentData([Values(0, 1, 2, 3, 60, 400)] int total)
        {
            // Preparation
            CreateEntities(total);

            int entityAmount3 = total / 3;
            int entityAmount1 = entityAmount3 + (total % 3 > 0 ? 1 : 0);
            int entityAmount2 = entityAmount3 + (total % 3 > 1 ? 1 : 0);

            var array1IntData   = new NativeArray <byte>(entityAmount1 * (UnsafeUtility.SizeOf <EcsPersistingTestData>() + PersistenceMetaData.SizeOfStruct), Allocator.TempJob);
            var array2FloatData = new NativeArray <byte>(entityAmount2 * (UnsafeUtility.SizeOf <EcsPersistingFloatTestData2>() + PersistenceMetaData.SizeOfStruct), Allocator.TempJob);
            var array5IntData   = new NativeArray <byte>(entityAmount3 * (UnsafeUtility.SizeOf <EcsPersistingTestData5>() + PersistenceMetaData.SizeOfStruct), Allocator.TempJob);

            var query1 = m_Manager.CreateEntityQuery(typeof(EcsPersistingTestData), typeof(PersistenceState));
            var query2 = m_Manager.CreateEntityQuery(typeof(EcsPersistingFloatTestData2), typeof(PersistenceState));
            var query3 = m_Manager.CreateEntityQuery(typeof(EcsPersistingTestData5), typeof(PersistenceState));

            Entities.With(query3).ForEach(entity =>
            {
                if (m_Manager.GetComponentData <PersistenceState>(entity).ArrayIndex < 3)
                {
                    m_Manager.DestroyEntity(entity);
                }
            });

            // Action
            var job1 = new CopyComponentDataToByteArray()
            {
                ComponentTypeHandle  = m_Manager.GetDynamicComponentTypeHandle(typeof(EcsPersistingTestData)),
                TypeSize             = UnsafeUtility.SizeOf <EcsPersistingTestData>(),
                PersistenceStateType = m_Manager.GetComponentTypeHandle <PersistenceState>(true),
                RawContainerData     = array1IntData,
                SubArrayOffset       = 0,
                SubArrayByteSize     = array1IntData.Length
            }.Schedule(query1);

            var job2 = new CopyComponentDataToByteArray()
            {
                ComponentTypeHandle  = m_Manager.GetDynamicComponentTypeHandle(typeof(EcsPersistingFloatTestData2)),
                TypeSize             = UnsafeUtility.SizeOf <EcsPersistingFloatTestData2>(),
                PersistenceStateType = m_Manager.GetComponentTypeHandle <PersistenceState>(true),
                RawContainerData     = array2FloatData,
                SubArrayOffset       = 0,
                SubArrayByteSize     = array2FloatData.Length
            }.Schedule(query2);

            var job3 = new CopyComponentDataToByteArray()
            {
                ComponentTypeHandle  = m_Manager.GetDynamicComponentTypeHandle(typeof(EcsPersistingTestData5)),
                TypeSize             = UnsafeUtility.SizeOf <EcsPersistingTestData5>(),
                PersistenceStateType = m_Manager.GetComponentTypeHandle <PersistenceState>(true),
                RawContainerData     = array5IntData,
                SubArrayOffset       = 0,
                SubArrayByteSize     = array5IntData.Length
            }.Schedule(query3);

            JobHandle.CombineDependencies(job1, job2, job3).Complete();

            // Check Results
            Entities.With(query1).ForEach(entity =>
            {
                var originalData     = m_Manager.GetComponentData <EcsPersistingTestData>(entity);
                var persistenceState = m_Manager.GetComponentData <PersistenceState>(entity);
                int byteIndex        = persistenceState.ArrayIndex * (UnsafeUtility.SizeOf <EcsPersistingTestData>() + PersistenceMetaData.SizeOfStruct) + PersistenceMetaData.SizeOfStruct;
                var copiedData       = *(EcsPersistingTestData *)((byte *)array1IntData.GetUnsafeReadOnlyPtr() + byteIndex);
                Assert.True(originalData.Equals(copiedData), "Data output by CopyComponentDataToByteArray does not match data on entity.");
            });

            Entities.With(query2).ForEach(entity =>
            {
                var originalData     = m_Manager.GetComponentData <EcsPersistingFloatTestData2>(entity);
                var persistenceState = m_Manager.GetComponentData <PersistenceState>(entity);
                int byteIndex        = persistenceState.ArrayIndex * (UnsafeUtility.SizeOf <EcsPersistingFloatTestData2>() + PersistenceMetaData.SizeOfStruct) + PersistenceMetaData.SizeOfStruct;
                var copiedData       = *(EcsPersistingFloatTestData2 *)((byte *)array2FloatData.GetUnsafeReadOnlyPtr() + byteIndex);
                Assert.True(originalData.Equals(copiedData), "Data output by CopyComponentDataToByteArray does not match data on entity.");
            });

            Entities.With(query3).ForEach(entity =>
            {
                var originalData     = m_Manager.GetComponentData <EcsPersistingTestData5>(entity);
                var persistenceState = m_Manager.GetComponentData <PersistenceState>(entity);
                int byteIndex        = persistenceState.ArrayIndex * (UnsafeUtility.SizeOf <EcsPersistingTestData5>() + PersistenceMetaData.SizeOfStruct) + PersistenceMetaData.SizeOfStruct;
                var copiedData       = *(EcsPersistingTestData5 *)((byte *)array5IntData.GetUnsafeReadOnlyPtr() + byteIndex);
                Assert.True(originalData.Equals(copiedData), "Data output by CopyComponentDataToByteArray does not match data on entity.");
            });

            for (int i = 0; i < entityAmount1; i++)
            {
                var stride   = (UnsafeUtility.SizeOf <EcsPersistingTestData>() + PersistenceMetaData.SizeOfStruct);
                var metaData = UnsafeUtility.ReadArrayElementWithStride <PersistenceMetaData>(array1IntData.GetUnsafeReadOnlyPtr(), i, stride);
                Assert.True(metaData.AmountFound == 1, "Entity was not found even though it existed.");
                Assert.True(metaData.HasChanged, "Data changed but meta data didn't record the change.");
            }
            for (int i = 0; i < entityAmount2; i++)
            {
                var stride   = (UnsafeUtility.SizeOf <EcsPersistingFloatTestData2>() + PersistenceMetaData.SizeOfStruct);
                var metaData = UnsafeUtility.ReadArrayElementWithStride <PersistenceMetaData>(array2FloatData.GetUnsafeReadOnlyPtr(), i, stride);
                Assert.True(metaData.AmountFound == 1, "Entity was not found even though it existed.");
                Assert.True(metaData.HasChanged, "Data changed but meta data didn't record the change.");
            }
            int amount5Found = 0;

            for (int i = 0; i < entityAmount3; i++)
            {
                var stride   = (UnsafeUtility.SizeOf <EcsPersistingTestData5>() + PersistenceMetaData.SizeOfStruct);
                var metaData = UnsafeUtility.ReadArrayElementWithStride <PersistenceMetaData>(array5IntData.GetUnsafeReadOnlyPtr(), i, stride);
                Assert.True(metaData.AmountFound == 1 || metaData.AmountFound == 0, "Incorrect AmountFound on meta data.");
                amount5Found += metaData.AmountFound;
                if (i > 2)
                {
                    Assert.True(metaData.HasChanged, "Data changed but meta data didn't record the change.");
                }
                else
                {
                    Assert.False(metaData.HasChanged, "Data did not change but meta data recorded a change.");
                }
            }
            Assert.True(amount5Found < entityAmount3 || amount5Found == 0, "More values were persisted than entities existed.");

            // Cleanup
            array1IntData.Dispose();
            array2FloatData.Dispose();
            array5IntData.Dispose();
            m_Manager.DestroyEntity(m_Manager.CreateEntityQuery(typeof(PersistenceState)));
        }