diff --git a/Extra2D/include/extra2d/core/module_macros.h b/Extra2D/include/extra2d/core/module_macros.h index b133562..a138fd1 100644 --- a/Extra2D/include/extra2d/core/module_macros.h +++ b/Extra2D/include/extra2d/core/module_macros.h @@ -58,12 +58,21 @@ struct ModuleAutoRegister { * @brief 简化版模块定义(静态自动注册) * * 用于引擎内部模块,在动态库加载时自动注册 + * 使用 constructor 属性确保在 main 之前执行注册 */ #define E2D_MODULE(ModuleClassName, priorityValue, ...) \ - __attribute__((used)) \ - static ::extra2d::detail::ModuleAutoRegister< ::extra2d::ModuleClassName> \ - E2D_CONCAT(_e2d_auto_reg_, ModuleClassName)( \ - #ModuleClassName, priorityValue, { __VA_ARGS__ }); + namespace { \ + struct E2D_CONCAT(ModuleReg_, ModuleClassName) { \ + ::extra2d::detail::ModuleAutoRegister< ::extra2d::ModuleClassName> reg; \ + E2D_CONCAT(ModuleReg_, ModuleClassName)() : reg(#ModuleClassName, priorityValue, { __VA_ARGS__ }) {} \ + }; \ + } \ + __attribute__((constructor)) \ + static void E2D_CONCAT(_e2d_reg_init_, ModuleClassName)() { \ + static ::extra2d::detail::ModuleAutoRegister< ::extra2d::ModuleClassName> \ + E2D_CONCAT(_e2d_auto_reg_, ModuleClassName)( \ + #ModuleClassName, priorityValue, { __VA_ARGS__ }); \ + } /** * @brief 外部模块定义(自动生成 force_link 函数) diff --git a/Extra2D/include/extra2d/core/module_meta.h b/Extra2D/include/extra2d/core/module_meta.h index 6ef288b..5a4a2c0 100644 --- a/Extra2D/include/extra2d/core/module_meta.h +++ b/Extra2D/include/extra2d/core/module_meta.h @@ -132,6 +132,14 @@ private: */ bool hasCircularDependency() const; + /** + * @brief 确保核心模块已注册 + * + * 由于静态链接时静态初始化可能被优化掉, + * 此函数在 createAndInitAll() 中被调用来确保核心模块被注册 + */ + void ensureCoreModulesRegistered(); + std::vector metas_; std::vector> instances_; std::unordered_map instanceMap_; diff --git a/Extra2D/src/core/module_registry.cpp b/Extra2D/src/core/module_registry.cpp index 25b3198..e7f9a44 100644 --- a/Extra2D/src/core/module_registry.cpp +++ b/Extra2D/src/core/module_registry.cpp @@ -1,6 +1,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -26,6 +30,39 @@ void ModuleRegistry::registerMeta(ModuleMetaBase *meta) { metas_.push_back(meta); } +void ModuleRegistry::ensureCoreModulesRegistered() { + static bool s_coreModulesRegistered = false; + if (s_coreModulesRegistered) { + return; + } + s_coreModulesRegistered = true; + + static ModuleMeta s_configMeta; + static ModuleMeta s_windowMeta; + static ModuleMeta s_inputMeta; + static ModuleMeta s_renderMeta; + + s_configMeta.name_ = "ConfigModule"; + s_configMeta.priority_ = 0; + s_configMeta.dependencies_ = {}; + registerMeta(&s_configMeta); + + s_windowMeta.name_ = "WindowModule"; + s_windowMeta.priority_ = 20; + s_windowMeta.dependencies_ = {"ConfigModule"}; + registerMeta(&s_windowMeta); + + s_inputMeta.name_ = "InputModule"; + s_inputMeta.priority_ = 30; + s_inputMeta.dependencies_ = {"WindowModule"}; + registerMeta(&s_inputMeta); + + s_renderMeta.name_ = "RenderModule"; + s_renderMeta.priority_ = 40; + s_renderMeta.dependencies_ = {"WindowModule"}; + registerMeta(&s_renderMeta); +} + std::vector ModuleRegistry::getAllMetas() const { return metas_; } @@ -177,8 +214,7 @@ bool ModuleRegistry::createAndInitAll() { return true; } - // 动态库中模块已通过 E2D_MODULE 宏自动注册 - // 无需手动调用 registerCoreModules() + ensureCoreModulesRegistered(); E2D_LOG_INFO("ModuleRegistry: {} modules registered", metas_.size()); for (auto *meta : metas_) { diff --git a/Extra2D/src/graphics/shader_manager.cpp b/Extra2D/src/graphics/shader_manager.cpp index 5130331..6191785 100644 --- a/Extra2D/src/graphics/shader_manager.cpp +++ b/Extra2D/src/graphics/shader_manager.cpp @@ -278,8 +278,14 @@ bool ShaderManager::loadBuiltinShaders() { shaders_["builtin_" + name] = std::move(info); loaded++; E2D_LOG_DEBUG("Loaded builtin shader: {}", name); + } else { + E2D_LOG_WARN("Failed to create shader: {}", name); } + } else { + E2D_LOG_WARN("Failed to parse shader: {} - {}", path, result.errorMessage); } + } else { + E2D_LOG_WARN("Shader file not found: {}", path); } } diff --git a/shader_cache/.cache_index b/shader_cache/.cache_index new file mode 100644 index 0000000..c458596 --- /dev/null +++ b/shader_cache/.cache_index @@ -0,0 +1,2 @@ +# Extra2D Shader Cache Index +# Format: name=hash