void FChunkManifestGenerator::FixupPackageDependenciesForChunks(FSandboxPlatformFile* InSandboxFile) { for (int32 ChunkID = 0, MaxChunk = ChunkManifests.Num(); ChunkID < MaxChunk; ++ChunkID) { FinalChunkManifests.Add(nullptr); if (!ChunkManifests[ChunkID]) { continue; } FinalChunkManifests[ChunkID] = new FChunkPackageSet(); for (auto It = ChunkManifests[ChunkID]->CreateConstIterator(); It; ++It) { AddPackageAndDependenciesToChunk(FinalChunkManifests[ChunkID], It.Key(), It.Value(), ChunkID, InSandboxFile); } } //Once complete, Add any remaining assets (that are not assigned to a chunk) to the first chunk. if (FinalChunkManifests.Num() == 0) { FinalChunkManifests.Add(nullptr); } if (!FinalChunkManifests[0]) { FinalChunkManifests[0] = new FChunkPackageSet(); } // Copy the remaining assets auto RemainingAssets = UnassignedPackageSet; for (auto It = RemainingAssets.CreateConstIterator(); It; ++It) { AddPackageAndDependenciesToChunk(FinalChunkManifests[0], It.Key(), It.Value(), 0, InSandboxFile); } //Finally, if the previous step may added any extra packages to the 0 chunk. Pull them out of other chunks and save space for (auto It = FinalChunkManifests[0]->CreateConstIterator(); It; ++It) { for (int32 ChunkID = 1, MaxChunk = FinalChunkManifests.Num(); ChunkID < MaxChunk; ++ChunkID) { if (!FinalChunkManifests[ChunkID]) { continue; } FinalChunkManifests[ChunkID]->Remove(It.Key()); } } // Fix up the asset registry to reflect this chunk layout for (int32 ChunkID = 0, MaxChunk = FinalChunkManifests.Num(); ChunkID < MaxChunk; ++ChunkID) { if (!FinalChunkManifests[ChunkID]) { continue; } for (const auto& Asset : *FinalChunkManifests[ChunkID]) { auto* AssetIndexArray = PackageToRegistryDataMap.Find(Asset.Key); if (AssetIndexArray) { for (auto AssetIndex : *AssetIndexArray) { AssetRegistryData[AssetIndex].ChunkIDs.AddUnique(ChunkID); } } } } }
void FChunkManifestGenerator::FixupPackageDependenciesForChunks(FSandboxPlatformFile* InSandboxFile) { for (int32 ChunkID = 0, MaxChunk = ChunkManifests.Num(); ChunkID < MaxChunk; ++ChunkID) { FinalChunkManifests.Add(nullptr); if (!ChunkManifests[ChunkID]) { continue; } FinalChunkManifests[ChunkID] = new FChunkPackageSet(); for (auto It = ChunkManifests[ChunkID]->CreateConstIterator(); It; ++It) { AddPackageAndDependenciesToChunk(FinalChunkManifests[ChunkID], It.Key(), It.Value(), ChunkID, InSandboxFile); } } auto* ChunkDepGraph = DependencyInfo->GetChunkDependencyGraph(ChunkManifests.Num()); //Once complete, Add any remaining assets (that are not assigned to a chunk) to the first chunk. if (FinalChunkManifests.Num() == 0) { FinalChunkManifests.Add(nullptr); } if (!FinalChunkManifests[0]) { FinalChunkManifests[0] = new FChunkPackageSet(); } // Copy the remaining assets auto RemainingAssets = UnassignedPackageSet; for (auto It = RemainingAssets.CreateConstIterator(); It; ++It) { AddPackageAndDependenciesToChunk(FinalChunkManifests[0], It.Key(), It.Value(), 0, InSandboxFile); } if (!CheckChunkAssetsAreNotInChild(*ChunkDepGraph)) { UE_LOG(LogChunkManifestGenerator, Log, TEXT("Initial scan of chunks found duplicate assets in graph children")); } //Finally, if the previous step may added any extra packages to the 0 chunk. Pull them out of other chunks and save space ResolveChunkDependencyGraph(*ChunkDepGraph, FChunkPackageSet()); if (!CheckChunkAssetsAreNotInChild(*ChunkDepGraph)) { UE_LOG(LogChunkManifestGenerator, Error, TEXT("Second Scan of chunks found duplicate asset entries in children.")); } // Fix up the asset registry to reflect this chunk layout for (int32 ChunkID = 0, MaxChunk = FinalChunkManifests.Num(); ChunkID < MaxChunk; ++ChunkID) { if (!FinalChunkManifests[ChunkID]) { continue; } for (const auto& Asset : *FinalChunkManifests[ChunkID]) { auto* AssetIndexArray = PackageToRegistryDataMap.Find(Asset.Key); if (AssetIndexArray) { for (auto AssetIndex : *AssetIndexArray) { AssetRegistryData[AssetIndex].ChunkIDs.AddUnique(ChunkID); } } } } }