public void ChangeEntityCapacity(int capacity) { Debug.Assert(IsPool); Debug.Assert(Archetypes.Length == 1); // Only pools with 1 PersistenceArchetype are supported Debug.Assert(capacity != EntityCapacity); // Grow InitialSceneState & fill with default InitialSceneState.ResizeByInitializingWithFirstEntry(capacity); // for each in ringbuffer // Copy that array & copy existing smaller data into it // Dispose of old array for (var i = 0; i < RingBuffer.Count; i++) { PersistentDataContainer persistentDataContainer = RingBuffer[i]; persistentDataContainer.ResizeByInitializingFromOther(capacity, InitialSceneState); RingBuffer[i] = persistentDataContainer; } // Change ArchetypeDataLayout PersistencyArchetypeDataLayout dataLayout = Archetypes[0]; dataLayout.Amount = capacity; Archetypes[0] = dataLayout; ref BlobArray <PersistencyArchetypeDataLayout.TypeInfo> typeInfoArray = ref dataLayout.PersistedTypeInfoArrayRef.Value;
private JobHandle SchedulePersistJobs(JobHandle inputDeps, PersistentDataContainer dataContainer, ComponentTypeHandle <PersistenceState> persistenceStateTypeHandle) { var returnJobHandle = inputDeps; for (int persistenceArchetypeIndex = 0; persistenceArchetypeIndex < dataContainer.DataLayoutCount; persistenceArchetypeIndex++) { PersistencyArchetypeDataLayout dataLayout = dataContainer.GetDataLayoutAtIndex(persistenceArchetypeIndex); ref BlobArray <PersistencyArchetypeDataLayout.TypeInfo> typeInfoArray = ref dataLayout.PersistedTypeInfoArrayRef.Value; PersistencyContainerTag containerTag = new PersistencyContainerTag { DataIdentifier = dataContainer.DataIdentifier }; PersistableTypeCombinationHash persistableTypeCombinationHash = new PersistableTypeCombinationHash { Value = dataLayout.PersistableTypeHandleCombinationHash }; for (int typeInfoIndex = 0; typeInfoIndex < typeInfoArray.Length; typeInfoIndex++) { // type info PersistencyArchetypeDataLayout.TypeInfo typeInfo = typeInfoArray[typeInfoIndex]; ComponentType runtimeType = ComponentType.ReadOnly(PersistencySettings.GetTypeIndex(typeInfo.PersistableTypeHandle)); int stride = typeInfo.ElementSize * typeInfo.MaxElements + PersistenceMetaData.SizeOfStruct; int byteSize = dataLayout.Amount * stride; // query var query = PersistableEntitiesQuery; query.SetSharedComponentFilter(containerTag, persistableTypeCombinationHash); JobHandle jobHandle; if (typeInfo.IsBuffer) { jobHandle = new CopyBufferElementsToByteArray { BufferTypeHandle = GetDynamicComponentTypeHandle(runtimeType), MaxElements = typeInfo.MaxElements, PersistenceStateType = persistenceStateTypeHandle, RawContainerData = dataContainer.GetRawData(), SubArrayOffset = dataLayout.Offset + typeInfo.Offset, SubArrayByteSize = byteSize, ElementSize = typeInfo.ElementSize }.Schedule(query, inputDeps); } else { jobHandle = new CopyComponentDataToByteArray() { ComponentTypeHandle = GetDynamicComponentTypeHandle(runtimeType), TypeSize = typeInfo.ElementSize, PersistenceStateType = persistenceStateTypeHandle, RawContainerData = dataContainer.GetRawData(), SubArrayOffset = dataLayout.Offset + typeInfo.Offset, SubArrayByteSize = byteSize }.Schedule(query, inputDeps); } query.ResetFilter(); returnJobHandle = JobHandle.CombineDependencies(returnJobHandle, jobHandle); } }
public void Execute(ArchetypeChunk batchInChunk, int batchIndex) { NativeArray <PersistenceState> persistenceStateArray = batchInChunk.GetNativeArray(PersistenceStateTypeHandle); NativeArray <Entity> entityArray = batchInChunk.GetNativeArray(EntityTypeHandle); NativeArray <PersistencyArchetypeIndexInContainer> archetypeIndexInContainerArray = batchInChunk.GetNativeArray(PersistencyArchetypeIndexInContainerTypeHandle); ValidateArchetypeIndexInContainer(archetypeIndexInContainerArray); PersistencyArchetypeDataLayout dataLayout = DataContainer.GetDataLayoutAtIndex(archetypeIndexInContainerArray[0].Index); ref BlobArray <PersistencyArchetypeDataLayout.TypeInfo> typeInfoArray = ref dataLayout.PersistedTypeInfoArrayRef.Value;