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))); }
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))); }