C++20 ECS编译时工厂注册表设计难题及可行方案
基于C++20的ECS引擎开发问题
我正在从零开发一款基于C++20标准的ECS架构游戏引擎作为学习项目。当前通过枚举定义组件位掩码,结合std::bitset管理实体组件,但该方案灵活性差,需集中定义组件,依赖度高。我希望实现一个编译时注册表,统计所有组件工厂数量并返回constexpr值以实例化std::bitset,同时在编译时将组件的静态字符串键替换为位掩码值,仅在运行时处理实体位运算。尝试过模板静态方法、无动态分配的自定义映射等方式但未成功。
编辑
经过探索,我得出以下结论与解决方案:
- 由于翻译单元需独立,无法跨翻译单元统计某事物的出现次数并将其作为constexpr值使用。
- 编译时注册表模式可行,但必须预先确定大小(无动态分配),这对代码简洁性是一大阻碍。
- 若顺序可能产生影响(注册表内部或多个注册表之间),编译时注册表并非理想选择。
选定方案
依赖静态实例化的静态注册表,存储std::function<void(RealRegistryHere &)>类型的vector。可控制何时执行lambda完成实际注册流程。
示例:(静态注册方法在Registerer的构造函数中调用)
在SomeFactory.cpp中:
static Registerer registerer([](ComponentRegistry ®istry, PoolManager &manager) { registry.registerType<SomeComponent>(new SomeFactory(manager)); });
通过这种方式,可在组件定义处完成注册,无需集中式注册。
内容的提问来源于stack exchange,提问作者Croquette the Soothsayer
相关产品推荐
相关产品推荐

