【ZeloEngine】反射系统填坑小结
【ZeloEngine】反射系统填坑小结
总结一下反射系统,下称ZHT
ZHT架构/数据流图
今天是入行两周年,本想写个入行小结,想想还是踏实点把坑填完,写个DevLog
本文接续之前一篇文章的原理描述,主要讲讲开发后的反思
另外说明,ZHT当然是下班时间开发的,所以进度会慢很多,好在能每天坚持写一点,代码也就攒起来了
【ZeloEngine】重写反射和对象系统_zoloypzuo的博客-CSDN博客
Demo
cyclone
生成代码位于__ZHT/
zoloypzuo/cyclone: 《游戏物理引擎开发》源码魔改
ogre
编译通过,ZHT运行5.5s
PropertySheet
PropertySheet,类似Unity的MonoBehavior,自动在Inspector上画界面编辑数据
特性列表
- 对标Swig,生成Lua脚本绑定
- 对标Moc,UBT的元信息标记机制meta.cs
- 对标C#,完全自动反射,生成RTTR绑定
- 生成imgui界面
- 丰富完整的C++信息收集,可以扩展后端,是通用的代码生成方案
语法特性
支持
- 全局函数
- 全局变量
- namespace
- struct/class // 统一为class
- enum
- 嵌套的class和enum
不支持
- C++模板 // 需要实例化
- C# property // 没必要
meta.cs不支持 // 用静态成员代替,因为C#语法不支持全局
- 全局函数
- 全局变量
特色:meta.cs
理解moc:是一种标记语言
moc的缺点
- moc标记,都是宏,缺乏IDE支持,重构,报错等
- moc标记,淹没在大量moc编译器不关心的代码中
- 不支持给第三方库打moc标记
meta.cs解决了以上问题
- 标记是C#语法,可以报错
- 标记与源码分离,容易统计分析和定位
- 支持第三方库
UBT vs ZHT
应用
- PropertySheet,配置表编辑器
- 替代Ver1的手工Lua脚本绑定,写脚本胶水从此无摩擦
- C++反射,可以走RTTR反射来调用了,更加动态的C++
- 对象模型中的其他子模块,GC,序列化,都依赖于反射系统
懒人模式
对标C#,最好不要写标记,正常写C++,然后就自带反射和导出Lua
这是目前努力的方向
这样做的好处
- 把ZHT隐藏起来,用户不需要操心怎么标记导出反射
- 便于单元测试,不需要费心维护测试用例
单元测试
由于程序的特点+懒人模式,可以很低成本地scale测试用例,来保证程序的健壮性
测试用例
- 重写Ver1的Lua驱动配置文件绑定,保证功能一致
- UHT,QtMoc,以及cocos的binding-generator,一些非真实的test-case,主要是覆盖C++语法
- 真实的项目:cyclone,ogre
如果能完整地反射一个ogre体量的引擎,基本ZHT就比较可用了
反思
- 基本思路清楚,快速搭建出第一个能跑的原型,只花了一周
- 实际填坑,实现规格(spec)以及自动化到铺量可用,花了一个月,细节很多
- 反复问自己几个问题
- 是什么?解决了什么问题?
- 重点难点是什么?
- 竞品方案对比
ZHT是什么?
- 解析C++代码结构到反射信息(中间表示),然后再生成多种目标代码
- 使用C#为C++标记上元信息,为ZHT和游戏/编辑器运行时提供元信息
重点和难点是什么?
- 理解源语言,也就是C++编译器
- 理解目标语言
- 代码生成是一种优化方法/自动化方法,要切实地自动化
对于反射系统而言,我们在乎声明,结构,类型,不在乎函数体里的计算代码
这块把重点放在了C++上,增进对C++编译器的理解对我目前的作用很大
竞品方案
- Lua脚本绑定
- 对标Swig,Swig的问题是黑盒不好控制,但是C++特性支持丰富
- cocos的binding-generator
- moc,UBT
奇怪的case清单
其实每个代码库都有自己的编程风格,ogre,ois,cyclone已经算是非常规范的OOP代码库了,至少保证内部风格统一
ZHT也主要是为我自己服务,所以不必去兼容所有库的写法,只是利用其他库作为测试用例来增强健壮性
不处理template
template<typename T, size_t Alignment>
struct AlignedAllocator : public std::allocator<T>
两个类互相依赖,ctor可以定义在类外面,问题是这样就需要去找这个类的引用,ZHT目前是直接从栈顶拿一个class,懒得搞搜索了,corner case
// these functions could not be defined within the class definition of class
// Radian because they required class Degree to be defined
inline Radian::Radian ( const Degree& d ) : mRad(d.valueRadians()) {}
指针不处理
std::vector<Plane>* planes;
const需要只读,目前先忽略const,建议封装成get函数
const OIS_ERROR eType;
const int eLine;
const MouseState& state;
【ZeloEngine】反射系统填坑小结相关推荐
- jetson windows_生命不息,折腾不止:Jetson Nano填坑之软件篇
题图:摄于武大凌波门 作为一名每天对着各种裸板的系统工程师,对Jetson Nano会踩到各种坑是做好了充分准备的,本着踩坑填坑的精神,在这里记录一下踩坑经历,供大家一乐.如何避开这些坑?想多了,因为 ...
- Python美股量化交易填坑记录——13c.Vegas隧道交易机器人(实盘记录)
1.背景 上一篇帖子介绍了思路调整的过程,我的目标从"消灭止损单"(越来越保守)改为"追大肉"(允许有止损单,盈利超过损失就行). Python美股量化交易填坑 ...
- H5填坑笔记--持续更新
最近一直在做移动端的页面,发现很多的坑,这里做一下总结,填填坑-- css常见的问题(一) 一.iOS键盘首字母自动大写 IOS的机子,默认英文输入法状态下,首字母是自动大写的,有时候挺烦人的. 在i ...
- 生命不息,折腾不止:Jetson Nano填坑之软件篇
[外链图片转存失败(img-xESuaLE9-1568108074549)(http://images.ilego.club/blog/2019/05/Jetson_nano_%E5%A1%AB%E5 ...
- Python美股量化交易填坑记录——13b.Vegas隧道交易机器人(实盘记录)
1.背景 上一篇帖子介绍了该算法的原理和八天的实盘记录: Python美股量化交易填坑记录--13a.Vegas隧道交易机器人_ChristopherShen的博客-CSDN博客 经过八天实盘后,已经 ...
- 小程序项目之填坑小记
作者:首席填坑官∙苏南 公众号:honeyBadger8,本文原创,著作权归作者所有,转载请注明原链接及出处. 简诉 是的,真的,你没有看错,我就是上次那个加薪的,但是现在问题来了,最近又搞了个小程序 ...
- java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
该文章出自:http://www.cnblogs.com/hucn/p/3572384.html 分析工具:http://www.blogjava.net/jjshcc/archive/2014/03 ...
- 20150726 填坑日记
三中内填坑: 1. 组合数递推什么的 C(m,n)=C(m,n-1)+C(m-1,n-1).填了个大坑,以前没认真听课QAQ 2. 裸题过河卒 3. 缺角正方形摆放车统计,分上下部分,枚举上部分放几个 ...
- 传统行业转型微服务的挖坑与填坑
原文:传统行业转型微服务的挖坑与填坑 一.微服务落地是一个复杂问题,牵扯到IT架构,应用架构,组织架构多个方面 在多家传统行业的企业走访和落地了微服务之后,发现落地微服务是一个非常复杂的问题,甚至都不 ...
最新文章
- this. $ refs: undefined 的解决办法
- 有了内阻值,怎么判断电池是否健康?
- android u盘拷贝文件大小,用手机U盘备份或导出手机文件,还能扩容
- J2EE Architecture(4)
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)...
- java.lang.UnsupportedClassVersionError: Bad version number in .class file异常
- 在墙上找垂直线_墙上如何快速找水平线
- 心血来潮,小试c++11
- 微信小程序之验证码短信倒计时
- Ordering disordered structures
- POJ 2706 Connect
- 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667B
- 【中秋系列】“Python中秋二维码”来了!扫一扫,会出现……
- linux压缩比例最大工具bzip2
- LeetCode——883. 三维形体投影面积
- 空白设计手法在平面设计中有哪些作用
- Windows 7之BitLock To Go
- PIXI学习历程 -- 持续更新
- 美国股市停牌休市日期一览表
- 面试屡次碰壁后,我是如何调整最终拿下一线大厂offer的?
热门文章
- 秋冬季健康生活小常识
- 在Vue中 用trun js + pdf-dist 实现pdf翻页效果
- 计算机链接投影蓝屏,怎么回事电脑与投影连接正常?电脑与投影连 – 手机爱问...
- 三菱FX系列PLC编程口通讯协议详解
- 一个屌丝程序猿的人生(六十三)
- javashop源码,javashop电商系统源码授权
- sourceTree回退代码
- Mixpanel接入
- 古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
- nlohmann json用法