【ZeloEngine】反射系统填坑小结

总结一下反射系统,下称ZHT

ZHT架构/数据流图

今天是入行两周年,本想写个入行小结,想想还是踏实点把坑填完,写个DevLog

本文接续之前一篇文章的原理描述,主要讲讲开发后的反思

另外说明,ZHT当然是下班时间开发的,所以进度会慢很多,好在能每天坚持写一点,代码也就攒起来了

【ZeloEngine】重写反射和对象系统_zoloypzuo的博客-CSDN博客

Demo

cyclone

生成代码位于__ZHT/

zoloypzuo/cyclone: 《游戏物理引擎开发》源码魔改

ogre

编译通过,ZHT运行5.5s

PropertySheet

PropertySheet,类似Unity的MonoBehavior,自动在Inspector上画界面编辑数据

特性列表

  1. 对标Swig,生成Lua脚本绑定
  2. 对标Moc,UBT的元信息标记机制meta.cs
  3. 对标C#,完全自动反射,生成RTTR绑定
  4. 生成imgui界面
  5. 丰富完整的C++信息收集,可以扩展后端,是通用的代码生成方案

语法特性

支持

  1. 全局函数
  2. 全局变量
  3. namespace
  4. struct/class // 统一为class
  5. enum
  6. 嵌套的class和enum

不支持

  1. C++模板 // 需要实例化
  2. C# property // 没必要

meta.cs不支持 // 用静态成员代替,因为C#语法不支持全局

  1. 全局函数
  2. 全局变量

特色:meta.cs

理解moc:是一种标记语言

moc的缺点

  1. moc标记,都是宏,缺乏IDE支持,重构,报错等
  2. moc标记,淹没在大量moc编译器不关心的代码中
  3. 不支持给第三方库打moc标记

meta.cs解决了以上问题

  1. 标记是C#语法,可以报错
  2. 标记与源码分离,容易统计分析和定位
  3. 支持第三方库

UBT vs ZHT

应用

  1. PropertySheet,配置表编辑器
  2. 替代Ver1的手工Lua脚本绑定,写脚本胶水从此无摩擦
  3. C++反射,可以走RTTR反射来调用了,更加动态的C++
  4. 对象模型中的其他子模块,GC,序列化,都依赖于反射系统

懒人模式

对标C#,最好不要写标记,正常写C++,然后就自带反射和导出Lua

这是目前努力的方向

这样做的好处

  1. 把ZHT隐藏起来,用户不需要操心怎么标记导出反射
  2. 便于单元测试,不需要费心维护测试用例

单元测试

由于程序的特点+懒人模式,可以很低成本地scale测试用例,来保证程序的健壮性

测试用例

  1. 重写Ver1的Lua驱动配置文件绑定,保证功能一致
  2. UHT,QtMoc,以及cocos的binding-generator,一些非真实的test-case,主要是覆盖C++语法
  3. 真实的项目:cyclone,ogre

如果能完整地反射一个ogre体量的引擎,基本ZHT就比较可用了

反思

  1. 基本思路清楚,快速搭建出第一个能跑的原型,只花了一周
  2. 实际填坑,实现规格(spec)以及自动化到铺量可用,花了一个月,细节很多
  3. 反复问自己几个问题
    • 是什么?解决了什么问题?
    • 重点难点是什么?
    • 竞品方案对比

ZHT是什么?

  1. 解析C++代码结构到反射信息(中间表示),然后再生成多种目标代码
  2. 使用C#为C++标记上元信息,为ZHT和游戏/编辑器运行时提供元信息

重点和难点是什么?

  1. 理解源语言,也就是C++编译器
  2. 理解目标语言
  3. 代码生成是一种优化方法/自动化方法,要切实地自动化

对于反射系统而言,我们在乎声明,结构,类型,不在乎函数体里的计算代码

这块把重点放在了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】反射系统填坑小结相关推荐

  1. jetson windows_生命不息,折腾不止:Jetson Nano填坑之软件篇

    题图:摄于武大凌波门 作为一名每天对着各种裸板的系统工程师,对Jetson Nano会踩到各种坑是做好了充分准备的,本着踩坑填坑的精神,在这里记录一下踩坑经历,供大家一乐.如何避开这些坑?想多了,因为 ...

  2. Python美股量化交易填坑记录——13c.Vegas隧道交易机器人(实盘记录)

    1.背景 上一篇帖子介绍了思路调整的过程,我的目标从"消灭止损单"(越来越保守)改为"追大肉"(允许有止损单,盈利超过损失就行). Python美股量化交易填坑 ...

  3. H5填坑笔记--持续更新

    最近一直在做移动端的页面,发现很多的坑,这里做一下总结,填填坑-- css常见的问题(一) 一.iOS键盘首字母自动大写 IOS的机子,默认英文输入法状态下,首字母是自动大写的,有时候挺烦人的. 在i ...

  4. 生命不息,折腾不止:Jetson Nano填坑之软件篇

    [外链图片转存失败(img-xESuaLE9-1568108074549)(http://images.ilego.club/blog/2019/05/Jetson_nano_%E5%A1%AB%E5 ...

  5. Python美股量化交易填坑记录——13b.Vegas隧道交易机器人(实盘记录)

    1.背景 上一篇帖子介绍了该算法的原理和八天的实盘记录: Python美股量化交易填坑记录--13a.Vegas隧道交易机器人_ChristopherShen的博客-CSDN博客 经过八天实盘后,已经 ...

  6. 小程序项目之填坑小记

    作者:首席填坑官∙苏南 公众号:honeyBadger8,本文原创,著作权归作者所有,转载请注明原链接及出处. 简诉 是的,真的,你没有看错,我就是上次那个加薪的,但是现在问题来了,最近又搞了个小程序 ...

  7. java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得

    该文章出自:http://www.cnblogs.com/hucn/p/3572384.html 分析工具:http://www.blogjava.net/jjshcc/archive/2014/03 ...

  8. 20150726 填坑日记

    三中内填坑: 1. 组合数递推什么的 C(m,n)=C(m,n-1)+C(m-1,n-1).填了个大坑,以前没认真听课QAQ 2. 裸题过河卒 3. 缺角正方形摆放车统计,分上下部分,枚举上部分放几个 ...

  9. 传统行业转型微服务的挖坑与填坑

    原文:传统行业转型微服务的挖坑与填坑 一.微服务落地是一个复杂问题,牵扯到IT架构,应用架构,组织架构多个方面 在多家传统行业的企业走访和落地了微服务之后,发现落地微服务是一个非常复杂的问题,甚至都不 ...

最新文章

  1. this. $ refs: undefined 的解决办法
  2. 有了内阻值,怎么判断电池是否健康?
  3. android u盘拷贝文件大小,用手机U盘备份或导出手机文件,还能扩容
  4. J2EE Architecture(4)
  5. hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)...
  6. java.lang.UnsupportedClassVersionError: Bad version number in .class file异常
  7. 在墙上找垂直线_墙上如何快速找水平线
  8. 心血来潮,小试c++11
  9. 微信小程序之验证码短信倒计时
  10. Ordering disordered structures
  11. POJ 2706 Connect
  12. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667B
  13. 【中秋系列】“Python中秋二维码”来了!扫一扫,会出现……
  14. linux压缩比例最大工具bzip2
  15. LeetCode——883. 三维形体投影面积
  16. 空白设计手法在平面设计中有哪些作用
  17. Windows 7之BitLock To Go
  18. PIXI学习历程 -- 持续更新
  19. 美国股市停牌休市日期一览表
  20. 面试屡次碰壁后,我是如何调整最终拿下一线大厂offer的?

热门文章

  1. 秋冬季健康生活小常识
  2. 在Vue中 用trun js + pdf-dist 实现pdf翻页效果
  3. 计算机链接投影蓝屏,怎么回事电脑与投影连接正常?电脑与投影连 – 手机爱问...
  4. 三菱FX系列PLC编程口通讯协议详解
  5. 一个屌丝程序猿的人生(六十三)
  6. javashop源码,javashop电商系统源码授权
  7. sourceTree回退代码
  8. Mixpanel接入
  9. 古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
  10. nlohmann json用法