虚幻的反射
反射是虚幻引擎中的基础技术,虚幻中的细节面板、序列化、垃圾回收、蓝图与C++交互等功能都依赖于反射。但原生C++并不支持反射,因此虚幻拥有一套自己的反射系统。
本文将对虚幻的反射机制进行浅析,更多信息可以查看工程文件中的generated和Marcos源码文件,里面有对反射更详细的解释。
反射的简要机制
Unreal Build Tool(UBT)和Unreal Header Tool(UHT)两个协同工作来生成运行时反射需要的数据。UBT通过扫描头文件,记录任何至少有一个反射类型的头文件的模块。如果其中任意一个头文件从上一次编译起发生了变化,那么UHT就会被调用来利用和更新反射数据。UHT分析头文件,创建一系列反射数据,并且生成包含反射数据的C++代码,放到每一个模块的generated文件中,使用标记宏标记的数据编译后可以在generated文件中看到,使用了一些宏对数据进行包装。
用生成的C++代码来存储反射数据的一个最大好处就是,它可以保证跟二进制做到同步,不会加载陈旧或者过时的反射数据,因为它是跟引擎的其它代码同时编译的,并且它会在程序启动的时候使用C++表达式来计算成员偏移等,而不是通过针对特定平台/编译器/优化的组合中进行逆向工程。
more >>