Пример #1
0
        public void TestDynamicPoolInitialState([Values(1, 22, 333, 4444)] int total)
        {
            // Prepare
            PersistencySettings         settings = CreateTestSettings();
            PersistentSceneSystem       persistentSceneSystem       = World.GetOrCreateSystem <PersistentSceneSystem>();
            BeginFramePersistencySystem beginFramePersistencySystem = World.GetExistingSystem <BeginFramePersistencySystem>();

            beginFramePersistencySystem.ReplaceSettings(settings);
            PersistentDataStorage dataStorage = persistentSceneSystem.PersistentDataStorage;
            Hash128 identifier = Hash128.Compute("DynamicPoolTests");

            NativeArray <PersistableTypeHandle> typeHandles = new NativeArray <PersistableTypeHandle>(Archetype.Length, Allocator.Persistent);

            for (int i = 0; i < typeHandles.Length; i++)
            {
                typeHandles[i] = settings.GetPersistableTypeHandleFromFullTypeName(Archetype[i].GetManagedType().FullName); // This is not advised in a game
            }

            // Action
            Entity prefabEntity = m_Manager.CreateEntity(Archetype);

            m_Manager.SetComponentData(prefabEntity, new EcsTestData(1));
            m_Manager.AddComponent <Prefab>(prefabEntity);
            persistentSceneSystem.InitializePool(prefabEntity, total, identifier, typeHandles);

            // Verify
            {
                Assert.True(dataStorage.IsInitialized(identifier), "PoolContainer is not initialized!");
                PersistentDataContainer container = dataStorage.GetInitialStateReadContainer(identifier);
                int sizePerEntity = container.GetDataLayoutAtIndex(0).SizePerEntity;
                Assert.AreEqual(sizePerEntity * total, container.GetRawData().Length, "The data container was not of the expected size!");
                int amountNonZero = container.GetRawData().Count(dataByte => dataByte != 0);
                Assert.NotZero(amountNonZero, "The datacontainer didn't have valid initial state.");
            }

            // Action 2
            total += 31;
            persistentSceneSystem.InstantChangePoolCapacity(identifier, total);

            // Verify
            {
                Assert.True(dataStorage.IsInitialized(identifier), "PoolContainer is not initialized!");
                dataStorage.ToIndex(0);
                PersistentDataContainer container = dataStorage.GetReadContainerForCurrentIndex(identifier);
                int sizePerEntity = container.GetDataLayoutAtIndex(0).SizePerEntity;
                Assert.AreEqual(sizePerEntity * total, container.GetRawData().Length, "The data container was not of the expected size after an InstantResize!");
                int amountNonZero = container.GetRawData().Count(dataByte => dataByte != 0);
                Assert.NotZero(amountNonZero, "The datacontainer grew but didn't have valid initial state.");
            }

            // Cleanup
            m_Manager.DestroyEntity(m_Manager.UniversalQuery);
        }