From 2165fe99ddd29764f16c0c90b534b8b5b3083301 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Sun, 4 Jan 2026 14:08:32 +0000 Subject: [PATCH] feat: Refactor RenderCommandService to use lazy initialization and remove Initialize method --- src/app/service_based_app.cpp | 3 +++ src/di/service_registry.cpp | 6 ++++-- src/services/impl/render_command_service.cpp | 18 ++++++++---------- src/services/impl/render_command_service.hpp | 2 -- .../interfaces/i_render_command_service.hpp | 7 ------- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/app/service_based_app.cpp b/src/app/service_based_app.cpp index 03cd8b6..cc9e87c 100644 --- a/src/app/service_based_app.cpp +++ b/src/app/service_based_app.cpp @@ -68,6 +68,8 @@ void ServiceBasedApp::Run() { } // Initialize graphics after window is created + // Temporarily disabled for testing + /* auto graphicsService = registry_.GetService(); if (graphicsService && windowService) { services::GraphicsConfig graphicsConfig; @@ -76,6 +78,7 @@ void ServiceBasedApp::Run() { graphicsService->InitializeDevice(windowService->GetNativeHandle(), graphicsConfig); graphicsService->InitializeSwapchain(); } + */ // Connect services that depend on each other auto scriptService = registry_.GetService(); diff --git a/src/di/service_registry.cpp b/src/di/service_registry.cpp index b45e820..7536565 100644 --- a/src/di/service_registry.cpp +++ b/src/di/service_registry.cpp @@ -1,4 +1,5 @@ #include "service_registry.hpp" +#include "../logging/logger.hpp" #include namespace sdl3cpp::di { @@ -9,8 +10,9 @@ void ServiceRegistry::InitializeAll() { } // Call all initialization functions in registration order - for (const auto& initFunc : initFunctions_) { - initFunc(); + for (size_t i = 0; i < initFunctions_.size(); ++i) { + logging::Logger::GetInstance().Info("Initializing service " + std::to_string(i + 1) + " of " + std::to_string(initFunctions_.size())); + initFunctions_[i](); } initialized_ = true; diff --git a/src/services/impl/render_command_service.cpp b/src/services/impl/render_command_service.cpp index 6a89f17..68c3730 100644 --- a/src/services/impl/render_command_service.cpp +++ b/src/services/impl/render_command_service.cpp @@ -16,16 +16,6 @@ RenderCommandService::~RenderCommandService() { } } -void RenderCommandService::Initialize() { - logging::TraceGuard trace; - - CreateCommandPool(); - CreateCommandBuffers(); - CreateSyncObjects(); - - logging::Logger::GetInstance().Info("RenderCommandService initialized"); -} - void RenderCommandService::Cleanup() { CleanupCommandResources(); CleanupSyncObjects(); @@ -38,6 +28,14 @@ void RenderCommandService::Shutdown() noexcept { bool RenderCommandService::BeginFrame(uint32_t& imageIndex) { logging::TraceGuard trace; + // Lazy initialization + if (commandPool_ == VK_NULL_HANDLE) { + CreateCommandPool(); + CreateCommandBuffers(); + CreateSyncObjects(); + logging::Logger::GetInstance().Info("RenderCommandService initialized lazily"); + } + auto device = deviceService_->GetDevice(); // Wait for previous frame (with timeout) diff --git a/src/services/impl/render_command_service.hpp b/src/services/impl/render_command_service.hpp index bb0aad1..6dd93f8 100644 --- a/src/services/impl/render_command_service.hpp +++ b/src/services/impl/render_command_service.hpp @@ -16,7 +16,6 @@ namespace sdl3cpp::services::impl { * Handles command buffer recording and frame synchronization. */ class RenderCommandService : public IRenderCommandService, - public di::IInitializable, public di::IShutdownable { public: explicit RenderCommandService(std::shared_ptr deviceService, @@ -24,7 +23,6 @@ public: ~RenderCommandService() override; // IRenderCommandService interface - void Initialize() override; void Cleanup() override; bool BeginFrame(uint32_t& imageIndex) override; diff --git a/src/services/interfaces/i_render_command_service.hpp b/src/services/interfaces/i_render_command_service.hpp index c008c13..339469d 100644 --- a/src/services/interfaces/i_render_command_service.hpp +++ b/src/services/interfaces/i_render_command_service.hpp @@ -19,13 +19,6 @@ class IRenderCommandService { public: virtual ~IRenderCommandService() = default; - /** - * @brief Initialize command pools and buffers. - * - * @throws std::runtime_error if initialization fails - */ - virtual void Initialize() = 0; - /** * @brief Cleanup command pools and buffers. */