CodeGen与反射系统
反射系统主要参考:
https://github.com/AustinBrunkHorst/CPP-Reflection
https://github.com/BoomingTech/Piccolo
核心是做codegen,codegen的内容除了有反射,还有序列化反序列化、py脚本api的注册。
使用
反射有别于ue的保守式标记,我们可以标记 WhiteListFields,一些示例:
可以用 PROPERTY(Disable) 标注无需加入codegen流程的变量;当然与之对应的用 WhiteListFields 标记的时候也可以用 PROPERTY(Enable) 单独把一个变量加入流程中。
原理分析
cmake编译HEngineParser,生成 HEngineParser.exe
cmake阶段收集引擎头文件。核心位于 Cmake/HEngineParser.cmake 中,用 configure_file 指令把这些头文件路径写入到一个json中。这个json最终输出在 Engine\Binaries\Win64\Programs\HEngineParser\precompile.json (需要注意的是,我们需要额外加入一些头文件,例如ThirdParty/glm/glm/glm.hpp,否则libclang不知道这是一个类型) 我们需要定义 CPP_CODE_GEN 才行。例如 cmake -B build -DCPP_CODE_GEN=ON
这个json作为参数传给 HEngineParser,HEngineParser使用libclang去解析这些头文件,获取到相应的信息,再用mustache去根据这些信息做codegen。这些信息主要指的是被我们的反射宏包裹的类型。
Last updated