diff --git a/Engine/include/Engine/Assets/AssetManager.h b/Engine/include/Engine/Assets/AssetManager.h index 8201edd..103ea62 100644 --- a/Engine/include/Engine/Assets/AssetManager.h +++ b/Engine/include/Engine/Assets/AssetManager.h @@ -232,6 +232,11 @@ namespace Engine // 后续扩展点:TextureHandle / MaterialHandle / ShaderHandle // 各自一个 AssetCache + 便捷方法,模式与 Model 完全一致。 + // 把 dirty 的 GUID 注册表落盘(Application 退出 / 场景保存时调)。 + // 内部幂等:非 dirty 直接 return。GetOrCreateGUID 只标 dirty 不落盘, + // 避免每次新增 GUID 都全量重写 yaml(开发期编辑器卡顿主因之一) + void FlushGUIDRegistry(); + private: void LoadGUIDRegistry(); void SaveGUIDRegistry() const; @@ -241,9 +246,13 @@ namespace Engine AssetCache m_Models; AssetCache m_Environments; - // GUID 注册表(双向);dirty 即时保存,无析构落盘依赖 + // GUID 注册表(双向);GetOrCreateGUID 标 dirty,FlushGUIDRegistry 落盘 + // (Application 退出 / 场景保存时统一 flush,避免每次新增都全量重写 yaml) std::unordered_map m_GuidToPath; std::unordered_map m_PathToGuid; + + bool m_GuidRegistryDirty = false; + }; } // namespace Assets } // namespace Engine diff --git a/Engine/src/Assets/AssetManager.cpp b/Engine/src/Assets/AssetManager.cpp index cde61c9..c55d3dd 100644 --- a/Engine/src/Assets/AssetManager.cpp +++ b/Engine/src/Assets/AssetManager.cpp @@ -50,6 +50,7 @@ namespace Engine::Assets { m_PathToGuid.emplace(path, guid); m_GuidToPath.emplace(guid, path); SaveGUIDRegistry(); + m_GuidRegistryDirty = true; return guid; } @@ -61,6 +62,12 @@ namespace Engine::Assets { return {}; } + void AssetManager::FlushGUIDRegistry() { + if (!m_GuidRegistryDirty) return; + SaveGUIDRegistry(); + m_GuidRegistryDirty = false; + } + void AssetManager::LoadGUIDRegistry() { try { diff --git a/Engine/src/Core/Application.cpp b/Engine/src/Core/Application.cpp index 4ed73e4..daf15a7 100644 --- a/Engine/src/Core/Application.cpp +++ b/Engine/src/Core/Application.cpp @@ -55,6 +55,13 @@ namespace Engine { m_Renderer->GetDevice().GetDevice().waitIdle(); } + // ✅ 进程退出前持久化 GUID 注册表(GetOrCreateGUID 只标 dirty, + // 此处统一落盘,避免开发期每次新增都触发全量 yaml 重写) + if (m_Assets) { + m_Assets->FlushGUIDRegistry(); + } + + if (m_ImGuiLayer) m_ImGuiLayer.reset(); // 注意:这里不能 Logger::Shutdown()——成员析构(Device 销毁等) diff --git a/Engine/src/Physics/PhysicsWorld.cpp b/Engine/src/Physics/PhysicsWorld.cpp index 3b09e4f..1f171bf 100644 --- a/Engine/src/Physics/PhysicsWorld.cpp +++ b/Engine/src/Physics/PhysicsWorld.cpp @@ -185,7 +185,7 @@ namespace Engine { m_ObjectVsObjectLayerFilter = CreateScope(); m_System = CreateScope(); - m_System->Init(4096, 0, 16384, 4096, + m_System->Init(4096, 65536, 16384, 4096, *m_BPLayerInterface, *m_ObjectVsBPLayerFilter, *m_ObjectVsObjectLayerFilter); m_System->SetGravity(JPH::Vec3(0.0f, -9.81f, 0.0f)); diff --git a/Engine/src/Serialization/SceneSerializer.cpp b/Engine/src/Serialization/SceneSerializer.cpp index 155687a..0bc62cd 100644 --- a/Engine/src/Serialization/SceneSerializer.cpp +++ b/Engine/src/Serialization/SceneSerializer.cpp @@ -461,6 +461,7 @@ namespace Engine::Serialization { return false; } file << doc; + assets.FlushGUIDRegistry(); return true; } catch (const YAML::Exception& e) { diff --git a/Engine/src/Vulkan/DescriptorManager.cpp b/Engine/src/Vulkan/DescriptorManager.cpp index 99979d2..4d43dca 100644 --- a/Engine/src/Vulkan/DescriptorManager.cpp +++ b/Engine/src/Vulkan/DescriptorManager.cpp @@ -34,8 +34,8 @@ namespace Engine vk::DescriptorPoolCreateInfo poolInfo; poolInfo.setMaxSets(kChunkSets) - .setPoolSizes(poolSizes) - .setFlags(vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet); + .setPoolSizes(poolSizes); + // .setFlags(vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet); return m_Device.GetDevice().createDescriptorPool(poolInfo); }