refactor: 主渲染改为框架固定行为,派生类渲染扩展走 OnRenderOverlay

原设计 OnRender() 既承载默认渲染又是虚钩子,派生类一 override
主渲染就丢失(钩子语义与框架行为耦合)。现在 Run() 固定调
Renderer.Render(scene),OnRenderOverlay() 只做叠加层(ImGui/
调试视图/编辑器 UI),不覆写则无叠加层——runtime 零渲染代码,
editor 扩展不破坏主渲染。
This commit is contained in:
2026-09-22 16:44:39 +08:00
parent 07a3b87001
commit bc63f76fc1
2 changed files with 11 additions and 10 deletions
+8 -4
View File
@@ -5,11 +5,14 @@
// //
// 分层目标:main 不再知道 Window/Renderer 的存在—— // 分层目标:main 不再知道 Window/Renderer 的存在——
// main 只 new 一个派生类并 Run(); // main 只 new 一个派生类并 Run();
// 派生类通过生命周期钩子(OnInit/OnUpdate/OnRender/OnShutdown) // 派生类通过生命周期钩子(OnInit/OnUpdate/OnRenderOverlay/OnShutdown)
// 和事件钩子(OnEvent + 类型化事件)定义程序行为; // 和事件钩子(OnEvent + 类型化事件)定义程序行为;
// runtime、editor 等不同程序形态只是不同的派生类。 // runtime、editor 等不同程序形态只是不同的派生类。
// //
// 主循环固定为:PollEvents → OnUpdate(dt) → OnRender → 判退出。 // 主循环固定为:PollEvents → OnUpdate(dt) → [主渲染 → OnRenderOverlay] → 判退出。
// 主渲染(Renderer.Render(scene))是框架行为,派生类不可覆盖也不会丢失;
// 派生类的渲染扩展(ImGui/调试视图/编辑器叠加层)走 OnRenderOverlay,
// 在主渲染之后、Present 之前执行,不覆写则什么都不发生。
// dt 由框架统一计时(含首帧与卡顿钳制),派生层无需自己管理。 // dt 由框架统一计时(含首帧与卡顿钳制),派生层无需自己管理。
// //
@@ -60,8 +63,9 @@ namespace Engine {
// 每帧逻辑更新(输入、动画、物理……) // 每帧逻辑更新(输入、动画、物理……)
virtual void OnUpdate(f32 deltaTime) {} virtual void OnUpdate(f32 deltaTime) {}
// 每帧渲染;默认实现驱动 Renderer 主循环,派生类可覆写 // 主渲染之后、当帧提交之前的叠加层钩子(ImGui/调试视图/编辑器 UI)。
virtual void OnRender(); // 主渲染由框架固定执行;这里只负责"额外的"渲染,不覆写则无叠加层。
virtual void OnRenderOverlay() {}
// 主循环结束后、析构前(保存、清理场景等) // 主循环结束后、析构前(保存、清理场景等)
virtual void OnShutdown() {} virtual void OnShutdown() {}
+3 -6
View File
@@ -73,7 +73,9 @@ namespace Engine {
// 延迟销毁在渲染前统一 flush,保证渲染遍历时池结构不变 // 延迟销毁在渲染前统一 flush,保证渲染遍历时池结构不变
m_Scene->FlushDestroyQueue(); m_Scene->FlushDestroyQueue();
OnRender(); // 主渲染是框架行为(不可覆盖);叠加层钩子在提交前执行
m_Renderer->Render(*m_Scene, *m_Assets);
OnRenderOverlay();
++m_FrameCount; ++m_FrameCount;
} }
@@ -82,11 +84,6 @@ namespace Engine {
ENGINE_INFO("Application stopped ({} frames)", m_FrameCount); ENGINE_INFO("Application stopped ({} frames)", m_FrameCount);
} }
void Application::OnRender()
{
m_Renderer->Render(*m_Scene, *m_Assets);
}
void Application::DispatchEvent(const Event& event) void Application::DispatchEvent(const Event& event)
{ {
OnEvent(event); OnEvent(event);