fix(module): 确保核心模块在静态链接时被正确注册
修复静态链接时核心模块可能未被注册的问题,通过添加 ensureCoreModulesRegistered 方法并在 createAndInitAll 中调用 改进 E2D_MODULE 宏使用 constructor 属性确保注册 添加核心模块的静态注册代码 同时完善 shader 加载的错误日志
This commit is contained in:
parent
ea1bbb891d
commit
367de0e611
|
|
@ -58,12 +58,21 @@ struct ModuleAutoRegister {
|
||||||
* @brief 简化版模块定义(静态自动注册)
|
* @brief 简化版模块定义(静态自动注册)
|
||||||
*
|
*
|
||||||
* 用于引擎内部模块,在动态库加载时自动注册
|
* 用于引擎内部模块,在动态库加载时自动注册
|
||||||
|
* 使用 constructor 属性确保在 main 之前执行注册
|
||||||
*/
|
*/
|
||||||
#define E2D_MODULE(ModuleClassName, priorityValue, ...) \
|
#define E2D_MODULE(ModuleClassName, priorityValue, ...) \
|
||||||
__attribute__((used)) \
|
namespace { \
|
||||||
static ::extra2d::detail::ModuleAutoRegister< ::extra2d::ModuleClassName> \
|
struct E2D_CONCAT(ModuleReg_, ModuleClassName) { \
|
||||||
E2D_CONCAT(_e2d_auto_reg_, ModuleClassName)( \
|
::extra2d::detail::ModuleAutoRegister< ::extra2d::ModuleClassName> reg; \
|
||||||
#ModuleClassName, priorityValue, { __VA_ARGS__ });
|
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 函数)
|
* @brief 外部模块定义(自动生成 force_link 函数)
|
||||||
|
|
|
||||||
|
|
@ -132,6 +132,14 @@ private:
|
||||||
*/
|
*/
|
||||||
bool hasCircularDependency() const;
|
bool hasCircularDependency() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 确保核心模块已注册
|
||||||
|
*
|
||||||
|
* 由于静态链接时静态初始化可能被优化掉,
|
||||||
|
* 此函数在 createAndInitAll() 中被调用来确保核心模块被注册
|
||||||
|
*/
|
||||||
|
void ensureCoreModulesRegistered();
|
||||||
|
|
||||||
std::vector<ModuleMetaBase*> metas_;
|
std::vector<ModuleMetaBase*> metas_;
|
||||||
std::vector<std::unique_ptr<Module>> instances_;
|
std::vector<std::unique_ptr<Module>> instances_;
|
||||||
std::unordered_map<std::string, Module*> instanceMap_;
|
std::unordered_map<std::string, Module*> instanceMap_;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,10 @@
|
||||||
#include <extra2d/core/module.h>
|
#include <extra2d/core/module.h>
|
||||||
#include <extra2d/core/module_macros.h>
|
#include <extra2d/core/module_macros.h>
|
||||||
#include <extra2d/core/module_meta.h>
|
#include <extra2d/core/module_meta.h>
|
||||||
|
#include <extra2d/modules/config_module.h>
|
||||||
|
#include <extra2d/modules/input_module.h>
|
||||||
|
#include <extra2d/modules/render_module.h>
|
||||||
|
#include <extra2d/modules/window_module.h>
|
||||||
#include <extra2d/utils/logger.h>
|
#include <extra2d/utils/logger.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
@ -26,6 +30,39 @@ void ModuleRegistry::registerMeta(ModuleMetaBase *meta) {
|
||||||
metas_.push_back(meta);
|
metas_.push_back(meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModuleRegistry::ensureCoreModulesRegistered() {
|
||||||
|
static bool s_coreModulesRegistered = false;
|
||||||
|
if (s_coreModulesRegistered) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
s_coreModulesRegistered = true;
|
||||||
|
|
||||||
|
static ModuleMeta<ConfigModule> s_configMeta;
|
||||||
|
static ModuleMeta<WindowModule> s_windowMeta;
|
||||||
|
static ModuleMeta<InputModule> s_inputMeta;
|
||||||
|
static ModuleMeta<RenderModule> 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<ModuleMetaBase *> ModuleRegistry::getAllMetas() const {
|
std::vector<ModuleMetaBase *> ModuleRegistry::getAllMetas() const {
|
||||||
return metas_;
|
return metas_;
|
||||||
}
|
}
|
||||||
|
|
@ -177,8 +214,7 @@ bool ModuleRegistry::createAndInitAll() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 动态库中模块已通过 E2D_MODULE 宏自动注册
|
ensureCoreModulesRegistered();
|
||||||
// 无需手动调用 registerCoreModules()
|
|
||||||
|
|
||||||
E2D_LOG_INFO("ModuleRegistry: {} modules registered", metas_.size());
|
E2D_LOG_INFO("ModuleRegistry: {} modules registered", metas_.size());
|
||||||
for (auto *meta : metas_) {
|
for (auto *meta : metas_) {
|
||||||
|
|
|
||||||
|
|
@ -278,8 +278,14 @@ bool ShaderManager::loadBuiltinShaders() {
|
||||||
shaders_["builtin_" + name] = std::move(info);
|
shaders_["builtin_" + name] = std::move(info);
|
||||||
loaded++;
|
loaded++;
|
||||||
E2D_LOG_DEBUG("Loaded builtin shader: {}", name);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Extra2D Shader Cache Index
|
||||||
|
# Format: name=hash
|
||||||
Loading…
Reference in New Issue