From b6982d426f77af68539573eefc539b9d4bd4a9c8 Mon Sep 17 00:00:00 2001 From: atdunbg Date: Wed, 23 Sep 2026 16:10:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Tracy=20profiler=20=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=EF=BC=88CPU=20=E5=B8=A7=E6=97=B6=E9=97=B4=E7=BA=BF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - vendored tracy 子模块;TRACY_ENABLE 全局生效,宏关闭时零开销 - 插桩:Application::Run FrameMark(帧边界)、Renderer::Render、 SceneRenderer::BuildFrame(ZoneScopedN)+ GPUDriven Collect (ZoneNamedN——同作用域第二个 zone 不能用 ZoneScopedN,变量名 固定会重声明)、Scene::UpdateTransforms - 覆盖 CPU 侧关键路径:帧时间线 / 场景收集 / transform 重算 / 录制提交 - 用法:游戏运行时打开 Tracy GUI(release 下载)即自动连接(8086 端口) --- .gitmodules | 3 ++ App/main.cpp | 2 +- Engine/CMakeLists.txt | 9 ++++++ Engine/include/Engine/ECS/Components.h | 43 ++++++++++++-------------- Engine/src/Core/Application.cpp | 3 ++ Engine/src/ECS/Scene.cpp | 3 ++ Engine/src/Renderer/Renderer.cpp | 3 ++ Engine/src/Renderer/SceneRenderer.cpp | 5 +++ Lib/tracy | 1 + 9 files changed, 48 insertions(+), 24 deletions(-) create mode 160000 Lib/tracy diff --git a/.gitmodules b/.gitmodules index d14ceae..d269654 100644 --- a/.gitmodules +++ b/.gitmodules @@ -20,3 +20,6 @@ [submodule "Lib/VulkanMemoryAllocator"] path = Lib/VulkanMemoryAllocator url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git +[submodule "Lib/tracy"] + path = Lib/tracy + url = https://github.com/wolfpld/tracy.git diff --git a/App/main.cpp b/App/main.cpp index ab8c405..a526fa4 100644 --- a/App/main.cpp +++ b/App/main.cpp @@ -48,7 +48,7 @@ protected: // 模型资产(AssetManager 负责加载/缓存/生命周期,返回句柄) // SunTemple:FBX + DDS 压缩贴图(DdsLoader 验证场景) - const auto model = GetAssets().LoadModel("assets/models/backpack/backpack.obj"); + const auto model = GetAssets().LoadModel("assets/models/viking_room/viking_room.obj"); const auto temple = GetAssets().LoadModel("assets/models/SunTemple/SunTemple.fbx"); m_Spinners.push_back(scene.CreateEntity("backpack")); diff --git a/Engine/CMakeLists.txt b/Engine/CMakeLists.txt index b230167..3f04a00 100644 --- a/Engine/CMakeLists.txt +++ b/Engine/CMakeLists.txt @@ -35,4 +35,13 @@ target_link_libraries(Engine PUBLIC assimp::assimp ) +# Tracy(CPU/GPU 帧分析):宏关闭时全部退化空操作,零开销 +set(TRACY_DIR ${CMAKE_SOURCE_DIR}/Lib/tracy) +target_include_directories(Engine PUBLIC ${TRACY_DIR}/public) +target_sources(Engine PRIVATE ${TRACY_DIR}/public/TracyClient.cpp) +target_compile_definitions(Engine PUBLIC TRACY_ENABLE) + +find_package(Threads REQUIRED) +target_link_libraries(Engine PUBLIC Threads::Threads) + target_compile_definitions(Engine PRIVATE VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1) \ No newline at end of file diff --git a/Engine/include/Engine/ECS/Components.h b/Engine/include/Engine/ECS/Components.h index 64e5bc1..9d71a8d 100644 --- a/Engine/include/Engine/ECS/Components.h +++ b/Engine/include/Engine/ECS/Components.h @@ -41,42 +41,39 @@ namespace Engine::ECS { // 层级(父子变换)留给后续的层级同步系统。 struct TransformComponent { // ---- 读取 ---- - const glm::vec3& GetPosition() const { return m_position; } - const glm::vec3& GetRotation() const { return m_rotation; } // 欧拉角(度) - const glm::vec3& GetScale() const { return m_scale; } - const glm::mat4& World() const { return m_world; } // 要求已由 UpdateTransforms 计算 + const glm::vec3& GetPosition() const { return m_Position; } + const glm::vec3& GetRotation() const { return m_Rotation; } // 欧拉角(度) + const glm::vec3& GetScale() const { return m_Scale; } + const glm::mat4& World() const { return m_World; } // 要求已由 UpdateTransforms 计算 // ---- 写入(标脏,脏实体由 UpdateTransforms 重算)---- - TransformComponent& SetPosition(const glm::vec3& p) { if (m_position != p) { m_position = p; m_dirty = true; } return *this; } - TransformComponent& SetRotation(const glm::vec3& r) { if (m_rotation != r) { m_rotation = r; m_dirty = true; } return *this; } - TransformComponent& SetScale(const glm::vec3& s) { if (m_scale != s) { m_scale = s; m_dirty = true; } return *this; } + TransformComponent& SetPosition(const glm::vec3& p) { if (m_Position != p) { m_Position = p; m_Dirty = true; } return *this; } + TransformComponent& SetRotation(const glm::vec3& r) { if (m_Rotation != r) { m_Rotation = r; m_Dirty = true; } return *this; } + TransformComponent& SetScale(const glm::vec3& s) { if (m_Scale != s) { m_Scale = s; m_Dirty = true; } return *this; } - // 便捷:原地修改单个欧拉角分量(度) - TransformComponent& AddRotationY(f32 degY) { m_rotation.y += degY; m_dirty = true; return *this; } - - bool IsDirty() const { return m_dirty; } + bool IsDirty() const { return m_Dirty; } // SRT 分量 → world 矩阵(T * R * S),清除脏标记。 // 由 Scene::UpdateTransforms 调用(或层级系统),勿手动 TransformComponent& Compose() { - const glm::mat4 t = glm::translate(glm::mat4(1.0f), m_position); + const glm::mat4 t = glm::translate(glm::mat4(1.0f), m_Position); const glm::mat4 r = - glm::rotate(glm::mat4(1.0f), glm::radians(m_rotation.y), glm::vec3(0, 1, 0)) * - glm::rotate(glm::mat4(1.0f), glm::radians(m_rotation.x), glm::vec3(1, 0, 0)) * - glm::rotate(glm::mat4(1.0f), glm::radians(m_rotation.z), glm::vec3(0, 0, 1)); - const glm::mat4 s = glm::scale(glm::mat4(1.0f), m_scale); - m_world = t * r * s; - m_dirty = false; + glm::rotate(glm::mat4(1.0f), glm::radians(m_Rotation.y), glm::vec3(0, 1, 0)) * + glm::rotate(glm::mat4(1.0f), glm::radians(m_Rotation.x), glm::vec3(1, 0, 0)) * + glm::rotate(glm::mat4(1.0f), glm::radians(m_Rotation.z), glm::vec3(0, 0, 1)); + const glm::mat4 s = glm::scale(glm::mat4(1.0f), m_Scale); + m_World = t * r * s; + m_Dirty = false; return *this; } private: - glm::vec3 m_position{0.0f}; - glm::vec3 m_rotation{0.0f}; - glm::vec3 m_scale{1.0f}; - glm::mat4 m_world{1.0f}; - bool m_dirty = true; // 出生即脏:首次 UpdateTransforms 计算 world + glm::vec3 m_Position{0.0f}; + glm::vec3 m_Rotation{0.0f}; + glm::vec3 m_Scale{1.0f}; + glm::mat4 m_World{1.0f}; + bool m_Dirty = true; // 出生即脏:首次 UpdateTransforms 计算 world }; // 网格渲染体:引用共享的 Model 资产。 diff --git a/Engine/src/Core/Application.cpp b/Engine/src/Core/Application.cpp index cf900cd..09d2861 100644 --- a/Engine/src/Core/Application.cpp +++ b/Engine/src/Core/Application.cpp @@ -13,6 +13,8 @@ #include +#include + #include #include @@ -133,6 +135,7 @@ namespace Engine { } } ++m_FrameCount; + FrameMark; // Tracy:帧边界(一帧的时间线切分) } OnShutdown(); diff --git a/Engine/src/ECS/Scene.cpp b/Engine/src/ECS/Scene.cpp index 0ec0f4b..42ebed0 100644 --- a/Engine/src/ECS/Scene.cpp +++ b/Engine/src/ECS/Scene.cpp @@ -6,6 +6,8 @@ #include #include +#include + namespace Engine::ECS { EntityHandle Scene::CreateEntity(std::string name) @@ -55,6 +57,7 @@ namespace Engine::ECS { void Scene::UpdateTransforms() { + ZoneScoped; // 只重算脏的:UE transform-update 阶段模式。 // 静止实体(绝大多数)零成本;层级传播在此扩展 m_Registry.view().each([](TransformComponent& t) { diff --git a/Engine/src/Renderer/Renderer.cpp b/Engine/src/Renderer/Renderer.cpp index 40c7f6e..5223b3b 100644 --- a/Engine/src/Renderer/Renderer.cpp +++ b/Engine/src/Renderer/Renderer.cpp @@ -33,6 +33,8 @@ #include #include +#include + #include #include @@ -307,6 +309,7 @@ namespace Engine void Renderer::Render(ECS::Scene& scene, Assets::AssetManager& assets) { + ZoneScoped; // CPU 侧:UBO/SSBO 上传 + 录制 + 提交(GPU 耗时见 RG timestamp) if (m_Window.WasResized()) { m_Window.ResetResizedFlag(); HandleResize(); diff --git a/Engine/src/Renderer/SceneRenderer.cpp b/Engine/src/Renderer/SceneRenderer.cpp index 41e29f0..799d27a 100644 --- a/Engine/src/Renderer/SceneRenderer.cpp +++ b/Engine/src/Renderer/SceneRenderer.cpp @@ -15,6 +15,8 @@ #include #include +#include + #include #include @@ -129,6 +131,7 @@ namespace Engine bool SceneRenderer::BuildFrame(ECS::Scene& scene, Assets::AssetManager& assets, vk::Extent2D targetExtent) { + ZoneScopedN("BuildFrame"); const auto collectStart = std::chrono::steady_clock::now(); // ---- 0. TAA 时域状态先行(velocity = 上一帧姿态与相机)---- @@ -188,6 +191,8 @@ namespace Engine ubo.cameraPos = glm::vec4(camTransform->GetPosition(), 1.0f); // ---- 3. GPUDriven:单趟收集 + 多视图剔除 ---- + // 同作用域第二个 zone:ZoneScopedN 变量名固定会重声明,用 ZoneNamedN + ZoneNamedN( ___tracy_collect, "GPUDriven Collect", true ); // 每个实例的包围球对 4 个视锥分别测试: // 相机视锥 → 主视图(Forward 画) // 各级联光视锥 → 各自的阴影 batch(Shadow 按 region 各画各的) diff --git a/Lib/tracy b/Lib/tracy new file mode 160000 index 0000000..81c5005 --- /dev/null +++ b/Lib/tracy @@ -0,0 +1 @@ +Subproject commit 81c5005509bf8f9d3cad90eb8155e24b8597a1dd