From 49bedde67b4c8b022a51756eb097f312d2f0fc70 Mon Sep 17 00:00:00 2001 From: Rowland <975945824@qq.com> Date: Tue, 30 Jun 2026 10:00:50 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=89=E4=B8=AD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MetaCoreBuiltinCoreServicesModule.cpp | 138 ++++++++++++++++-- 1 file changed, 129 insertions(+), 9 deletions(-) diff --git a/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp b/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp index 19a3518..c41f37d 100644 --- a/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp +++ b/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp @@ -3078,7 +3078,6 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon } // 槽位列表循环 - const auto materialChoices = MetaCoreCollectMaterialAssetChoices(editorContext); for (std::size_t materialIndex = 0; materialIndex < meshRenderer.MaterialAssetGuids.size(); ++materialIndex) { MetaCoreAssetGuid materialGuid = meshRenderer.MaterialAssetGuids[materialIndex]; const std::string elementLabel = "Element " + std::to_string(materialIndex); @@ -3189,6 +3188,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon } } ImGui::Separator(); + const auto materialChoices = MetaCoreCollectMaterialAssetChoices(editorContext); for (const auto& choice : materialChoices) { bool isSelected = (choice.AssetGuid == materialGuid); if (ImGui::Selectable(choice.Label.c_str(), isSelected)) { @@ -6224,6 +6224,7 @@ public: PackageService_.reset(); ReflectionRegistry_.reset(); ModelCache_.clear(); + ClearGeneratedAssetCaches(); } [[nodiscard]] std::optional LoadModelAsset( @@ -6257,6 +6258,11 @@ public: ) const override; private: + void CacheGeneratedAssetDocuments( + const MetaCoreAssetRecord& sourceRecord, + const MetaCoreModelAssetDocument& document + ) const; + void ClearGeneratedAssetCaches() const; void RescanHotReloadBaseline() const; MetaCoreEditorModuleRegistry* ModuleRegistry_ = nullptr; @@ -6264,6 +6270,10 @@ private: std::shared_ptr PackageService_{}; std::shared_ptr ReflectionRegistry_{}; mutable std::unordered_map ModelCache_{}; + mutable std::unordered_map MeshCache_{}; + mutable std::unordered_map MaterialCache_{}; + mutable std::unordered_map TextureCache_{}; + mutable std::unordered_map GeneratedAssetRecordCache_{}; }; bool MetaCoreBuiltinCookService::CookAsset(const MetaCoreAssetGuid& assetGuid) { @@ -6406,13 +6416,60 @@ bool MetaCoreBuiltinCookService::CookAsset(const MetaCoreAssetGuid& assetGuid) { return true; } +void MetaCoreBuiltinAssetEditingService::ClearGeneratedAssetCaches() const { + MeshCache_.clear(); + MaterialCache_.clear(); + TextureCache_.clear(); + GeneratedAssetRecordCache_.clear(); +} + +void MetaCoreBuiltinAssetEditingService::CacheGeneratedAssetDocuments( + const MetaCoreAssetRecord& sourceRecord, + const MetaCoreModelAssetDocument& document +) const { + for (std::size_t index = 0; index < document.GeneratedMeshAssets.size(); ++index) { + const MetaCoreMeshAssetDocument& mesh = document.GeneratedMeshAssets[index]; + if (!mesh.AssetGuid.IsValid()) { + continue; + } + MeshCache_[mesh.AssetGuid] = mesh; + GeneratedAssetRecordCache_[mesh.AssetGuid] = MetaCoreResolvedGeneratedAssetRecord{ + sourceRecord, + "mesh", + index + }; + } + + for (std::size_t index = 0; index < document.GeneratedMaterialAssets.size(); ++index) { + const MetaCoreMaterialAssetDocument& material = document.GeneratedMaterialAssets[index]; + if (!material.AssetGuid.IsValid()) { + continue; + } + MaterialCache_[material.AssetGuid] = material; + GeneratedAssetRecordCache_[material.AssetGuid] = MetaCoreResolvedGeneratedAssetRecord{ + sourceRecord, + "material", + index + }; + } + + for (std::size_t index = 0; index < document.GeneratedTextureAssets.size(); ++index) { + const MetaCoreTextureAssetDocument& texture = document.GeneratedTextureAssets[index]; + if (!texture.AssetGuid.IsValid()) { + continue; + } + TextureCache_[texture.AssetGuid] = texture; + GeneratedAssetRecordCache_[texture.AssetGuid] = MetaCoreResolvedGeneratedAssetRecord{ + sourceRecord, + "texture", + index + }; + } +} + std::optional MetaCoreBuiltinAssetEditingService::LoadModelAsset( const MetaCoreAssetGuid& assetGuid ) const { - if (const auto cacheIterator = ModelCache_.find(assetGuid); cacheIterator != ModelCache_.end()) { - return cacheIterator->second; - } - if (AssetDatabaseService_ == nullptr || PackageService_ == nullptr || ReflectionRegistry_ == nullptr) { return std::nullopt; } @@ -6422,6 +6479,12 @@ std::optional MetaCoreBuiltinAssetEditingService::Lo return std::nullopt; } + if (const auto cacheIterator = ModelCache_.find(assetGuid); cacheIterator != ModelCache_.end() && + (assetRecord->SourceHash == 0 || cacheIterator->second.SourceHash == assetRecord->SourceHash)) { + CacheGeneratedAssetDocuments(*assetRecord, cacheIterator->second); + return cacheIterator->second; + } + auto doc = MetaCoreLoadModelAssetDocumentForRecord( *AssetDatabaseService_, *PackageService_, @@ -6431,6 +6494,7 @@ std::optional MetaCoreBuiltinAssetEditingService::Lo ); if (doc.has_value()) { ModelCache_[assetGuid] = *doc; + CacheGeneratedAssetDocuments(*assetRecord, *doc); } return doc; } @@ -6438,6 +6502,10 @@ std::optional MetaCoreBuiltinAssetEditingService::Lo std::optional MetaCoreBuiltinAssetEditingService::LoadMeshAsset( const MetaCoreAssetGuid& meshGuid ) const { + if (const auto cacheIterator = MeshCache_.find(meshGuid); cacheIterator != MeshCache_.end()) { + return cacheIterator->second; + } + if (AssetDatabaseService_ == nullptr || PackageService_ == nullptr || ReflectionRegistry_ == nullptr) { return std::nullopt; } @@ -6456,12 +6524,23 @@ std::optional MetaCoreBuiltinAssetEditingService::Loa if (resolved->GeneratedIndex >= resolved->Document.GeneratedMeshAssets.size()) { return std::nullopt; } - return resolved->Document.GeneratedMeshAssets[resolved->GeneratedIndex]; + const MetaCoreMeshAssetDocument mesh = resolved->Document.GeneratedMeshAssets[resolved->GeneratedIndex]; + MeshCache_[meshGuid] = mesh; + GeneratedAssetRecordCache_[meshGuid] = MetaCoreResolvedGeneratedAssetRecord{ + resolved->AssetRecord, + resolved->GeneratedKind, + resolved->GeneratedIndex + }; + return mesh; } std::optional MetaCoreBuiltinAssetEditingService::LoadMaterialAsset( const MetaCoreAssetGuid& materialGuid ) const { + if (const auto cacheIterator = MaterialCache_.find(materialGuid); cacheIterator != MaterialCache_.end()) { + return cacheIterator->second; + } + if (AssetDatabaseService_ == nullptr || ReflectionRegistry_ == nullptr) { return std::nullopt; } @@ -6484,7 +6563,14 @@ std::optional MetaCoreBuiltinAssetEditingService: ); if (resolved.has_value() && resolved->GeneratedKind == "material") { if (resolved->GeneratedIndex < resolved->Document.GeneratedMaterialAssets.size()) { - return resolved->Document.GeneratedMaterialAssets[resolved->GeneratedIndex]; + const MetaCoreMaterialAssetDocument material = resolved->Document.GeneratedMaterialAssets[resolved->GeneratedIndex]; + MaterialCache_[materialGuid] = material; + GeneratedAssetRecordCache_[materialGuid] = MetaCoreResolvedGeneratedAssetRecord{ + resolved->AssetRecord, + resolved->GeneratedKind, + resolved->GeneratedIndex + }; + return material; } } } @@ -6495,6 +6581,10 @@ std::optional MetaCoreBuiltinAssetEditingService: std::optional MetaCoreBuiltinAssetEditingService::LoadTextureAsset( const MetaCoreAssetGuid& textureGuid ) const { + if (const auto cacheIterator = TextureCache_.find(textureGuid); cacheIterator != TextureCache_.end()) { + return cacheIterator->second; + } + if (AssetDatabaseService_ == nullptr || PackageService_ == nullptr || ReflectionRegistry_ == nullptr) { return std::nullopt; } @@ -6542,7 +6632,14 @@ std::optional MetaCoreBuiltinAssetEditingService:: if (resolved->GeneratedIndex >= resolved->Document.GeneratedTextureAssets.size()) { return std::nullopt; } - return resolved->Document.GeneratedTextureAssets[resolved->GeneratedIndex]; + const MetaCoreTextureAssetDocument texture = resolved->Document.GeneratedTextureAssets[resolved->GeneratedIndex]; + TextureCache_[textureGuid] = texture; + GeneratedAssetRecordCache_[textureGuid] = MetaCoreResolvedGeneratedAssetRecord{ + resolved->AssetRecord, + resolved->GeneratedKind, + resolved->GeneratedIndex + }; + return texture; } void MetaCoreBuiltinAssetEditingService::RescanHotReloadBaseline() const { @@ -6582,6 +6679,9 @@ bool MetaCoreBuiltinAssetEditingService::SaveModelImportSettings( *modelDocument ); if (saved) { + ModelCache_[modelGuid] = *modelDocument; + ClearGeneratedAssetCaches(); + CacheGeneratedAssetDocuments(*assetRecord, *modelDocument); RescanHotReloadBaseline(); } return saved; @@ -6603,6 +6703,8 @@ bool MetaCoreBuiltinAssetEditingService::SaveMaterialAsset( return false; } + MaterialCache_.erase(materialGuid); + GeneratedAssetRecordCache_.erase(materialGuid); const std::filesystem::path metaPath = MetaCoreBuildMetaPath(absolutePath); MetaCoreAssetMetadataDocument metadata; if (MetaCoreReadMetaJson(metaPath, metadata)) { @@ -6636,6 +6738,8 @@ bool MetaCoreBuiltinAssetEditingService::SaveMaterialAsset( ); if (saved) { ModelCache_[resolved->AssetRecord.Guid] = editableDocument; + ClearGeneratedAssetCaches(); + CacheGeneratedAssetDocuments(resolved->AssetRecord, editableDocument); RescanHotReloadBaseline(); } return saved; @@ -6649,6 +6753,11 @@ bool MetaCoreBuiltinAssetEditingService::SaveMaterialAsset( std::optional MetaCoreBuiltinAssetEditingService::ResolveGeneratedAsset( const MetaCoreAssetGuid& assetGuid ) const { + if (const auto cacheIterator = GeneratedAssetRecordCache_.find(assetGuid); + cacheIterator != GeneratedAssetRecordCache_.end()) { + return cacheIterator->second; + } + if (AssetDatabaseService_ == nullptr || PackageService_ == nullptr || ReflectionRegistry_ == nullptr) { return std::nullopt; } @@ -6664,11 +6773,22 @@ std::optional MetaCoreBuiltinAssetEditingS return std::nullopt; } - return MetaCoreResolvedGeneratedAssetRecord{ + MetaCoreResolvedGeneratedAssetRecord record{ resolved->AssetRecord, resolved->GeneratedKind, resolved->GeneratedIndex }; + GeneratedAssetRecordCache_[assetGuid] = record; + + if (resolved->GeneratedKind == "mesh" && resolved->GeneratedIndex < resolved->Document.GeneratedMeshAssets.size()) { + MeshCache_[assetGuid] = resolved->Document.GeneratedMeshAssets[resolved->GeneratedIndex]; + } else if (resolved->GeneratedKind == "material" && resolved->GeneratedIndex < resolved->Document.GeneratedMaterialAssets.size()) { + MaterialCache_[assetGuid] = resolved->Document.GeneratedMaterialAssets[resolved->GeneratedIndex]; + } else if (resolved->GeneratedKind == "texture" && resolved->GeneratedIndex < resolved->Document.GeneratedTextureAssets.size()) { + TextureCache_[assetGuid] = resolved->Document.GeneratedTextureAssets[resolved->GeneratedIndex]; + } + + return record; } bool MetaCoreBuiltinCookService::CookScene(const std::filesystem::path& relativeScenePath) {