参数编辑

可以说, 引擎工具在除了一些特定操作外, 80%的事情都是在进行参数的编辑与保存等. 从我接触工具开发开始, 就一直在学习如何简化这么部分的工作. 因为我见过很多业余的编辑器, 大多都是每加一个参数就在UI层写一些代码, 在IO层加一些版本兼容代码等. 而这些代码常常都是大同小异的, 很多都是Ctrl+C, Ctrl+V出来的. 说起来, 这个探索过程中我也走了不少的弯路, 顺便写出来当教训吧
最早是从java/.net转来写C++, 所以对于C++的UI开发十分的不满. 但是对于3D引擎来说, 目前来说语言也没有更好的的选择. 所以, 也有很多引擎是多语言的架构, 如底层C++, 工具C#, 逻辑lua. 这是比较常见的一种选择. .net在语言层次对于反射和序列化提供了非常好的支持, 可以参考我早期的文章:  强大的PropertyGrid. 为此, 我自学了C++/CLI, 把C++与.net的interop全部搞定了, 并且使用WPF试着做了一个工具. 结果呢? 没有人能维护的了, 因为.net对于那些只写过C/C++的人来说, 太复杂了. 更何况, 又加上一个毁三观的WPF. 所以说, 新技术并不一定就好, 就算它们吹的多么玄乎, 也不要忘了自己团队的实际情况. 虽然这次尝试最终放弃了, 不过在此过程中积累的经验让我山寨成功了 Unity3D的脚本系统. 这条路不是说走不通, 因为很多国外的中小引擎就是这么干的. 只不过对于开发人员的要求会高一些. 做过脚本系统的人都知道, 在两种语言之间转来转去的要多恶心就有多恶心.
当然, 上面这些尝试, 多数是业余的技术玩具. 工作中, 很多工具还是MFC的. 所以现实一点的话, 一般还是会在原有基础上做. 所以那时也参考了一下同样是MFC写的Ogitor(后来改Qt了). 于是乎就有了这么一篇:  基于属性的编辑器框架. 这个思路经过验证还是不错的, 对于当时的我来说, 在一条没有人走过的路上把东西做出来了, 算是一种自我突破. 一些编辑器常见的问题: Undo/Redo, 版本格式兼容等也做了考虑. 不过有两个问题没有解决: 一是属性的访问效率, 二是代码冗余(手工重复添加的代码太多).
中间还试过把WPF的控件放到MFC的工具里, 虽说技术上的问题也都解决了, 但是只要出了问题别人都搞不定. 算是一条邪路, 哈哈
目前阶段, 在接触了一些大牛和商业引擎后, 最终的选择是: Qt + C++反射 + C++序列化. 这个虽然有对语言进行改造的嫌疑, 但是实际项目验证下来, 是相对比较完美的解决方案. 因为一旦把底层搞定了, 后续开发可以节省程序至少三分之二的开发量, 一劳永逸. 参见:  关于游戏引擎结构上的思考,  C++的反射和序列化
Undo/Redo(撤消/重做)

我们一大牛说过: "判断一个工具是不是成熟, 就看它有没有Undo/Redo的功能". 的确是这样的, 因为在我维护过的编辑器里, 只要没有做到这一点的, 编辑器都是拿代码堆出来的, 没有一个整体上的设计, 然后换个人来维护就是死去活来的感觉. 其实看过设计模式的人都知道, Undo/Redo就是使用Command模式来解决. 但是, 从我面试过的人来看, 大多数都是知道这个模式, 真正做了的很少. 因为这个模式有一个弊端: 编码量大. 因为很多操作只是改变一个变量的值而已. 所以呢, 一些偷懒的程序员, 就把这个功能给省了, 反正工具的用户通常最低的要求是"先有这个功能, 再考虑易用性". 在 基于属性的编辑器框架里, 我第一次尝试了基于属性的Undo/Redo. "编辑器"其实本质上来说, 就是"编辑数据". 所以呢, Undo/Redo本质上来说, 就是"数据"的备份/还原的过程. 按照这个思路来设计, 肯定是没有错的. 最近结合C++的反射序列化做了Undo/Redo, 其实就是通用的Undo/Redo操作. 这样就解决了Undo/Redo需要每个操作都定义一个Command的问题, 因为数据抽象了, Command也简化了. 
文件格式版本兼容

这也是一个很多项目面临的问题. 对于二进制文件来说, 低水平的人会直接把结构体写进去, 加个版本号; 中水平的人会使用ChunkData, 让格式可以扩充. 高水平的呢? 格式中保存的参数可以改变类型, 增加/删除属性, 不但向下兼容, 还向上兼容. 所以说, 很多人会选择XML/JSON来做开发时的数据保存格式. 相对于二进制格式来说, XML/JSON为什么可以实现新老版本之间的兼容呢? 我觉得本质上来说, 还是因为它的属性访问是基于"名字"的. 也就是说, 把文件格式设计成类似于map的方式, 通过key去查找对应的值, 就可以实现版本之间的兼容. 形象点说, 文件里保存的是pair<name, value>的集合. 那么, 二进制格式也要把"名字"字符串保存进去吗? 虽说有这么干的, 更好的办法是保存字符串的CRC值, 也就是pair<nameCRC, value>.
稳定性

不会犯错的程序员, 基本上是不存在的. 所以呢, 工具中新开发的功能, 99%是有BUG的. 严重一点, 就是崩溃了. 然后程序就会不停打喷嚏了. 如何改善工具的稳定性呢? 这个需要分三个方面来说. 预防, 容错, 查错, 三管齐下.
把错误扼杀的摇篮里是最理想的. 这个就需要引入自动测试. 但是呢, 我之前都没有重视这个, 然后就不停地做善后工作. 做烦了回头来想想, 原来是这个东西没做到位...所以呢, 算是一个教训, 还没有经验, 提醒自己改进
容错的话, 通常就是做异常处理了. 这个只是补救的办法, 让用户体验好一点而已. 如果之前使用了Command模式, 那就更好办了, 只需要在Command执行的时候统一处理就行了. 虽说容错可能会导致更加严重的错误, 但是多数是可以补救的, 利大于弊
查错. 如果经常在做这件事, 那就要从头想想自己哪里没做到位. 这里说的, 只是方便查错的一些措施. 一, 多写log, 代码中多写assert. 二, 生成dump, 让用户可以反馈崩溃. 顺便推荐一个库:  CrashRpt
以上就是工作以来的一些经验教训了. 下一步还有什么可以尝试的? 或许是多人协作编辑, 多进程通信, 插件机制......

引擎工具开发的一些总结相关推荐

  1. 游戏开发常用引擎工具介绍对比区别(UE4,Unity,Cocos,LayaAir,[egret白鹭])

    UE4(即虚幻4) 是一套为开发实时技术而存在的引擎工具.目前广泛应用于3D建模渲染.游戏开发中.它完善的工具套件以及简易的工作流程能够使开发者快速修改或查看成果,对于代码的依赖性很低.而完整公开的源 ...

  2. 真封神引擎技术篇之易语言GM工具开发教程第三集

    真封神引擎技术篇之易语言GM工具开发教程第三集www.52fengshen.com 下载地址 http://pan.baidu.com/s/1uyTBG

  3. 虚幻引擎虚拟现实开发基础学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...

  4. 如何自学游戏引擎的开发?

    PS:题猪分得清游戏和游戏引擎的区别,所以各位答主不需要劳神解释两者的区别关系什么的了 PS:这里的游戏引擎暂时指图形模块,其他的声音,物理,网络,UI等等模块暂时不考虑 题猪一直自学编程,有c++. ...

  5. Slickflow.NET 开源工作流引擎高级开发(四) -- 硬核编码:代码式快速构建流程图...

    前言:通过设计器交互来创建流程图是比较常见的方式,这种方式是比较方便业务人员对流程的操作.然而,在需要流程模板,或者技术开发阶段以及一些自动化流程的处理过程中,使用代码快速创建流程图也是一种非常有必要 ...

  6. 游戏引擎除了开发游戏还能做什么?

    近几年,国内游戏市场有了爆发性的增长,随着电竞手游层出不穷.职业玩家不断壮大,游戏开发和 "Unity&虚幻引擎"成为很多人茶余饭后讨论的话题,越来越多年轻人想要学会这项技 ...

  7. JAVA制作网页的软件有哪些,html5开发工具(开发html5网页的软件有哪些)

    html5开发工具 1.SublimeText SublimeText是一个跨渠道的代码编bai辑器,一起支持duWindows.Linux.MacOSX等操作系统,也是HTML和散文zhi先进的文本 ...

  8. 虚幻引擎编辑器开发基础(一)

    虚幻引擎编辑器开发基础(一) 文章目录 虚幻引擎编辑器开发基础(一) 一.前言 二.插件与模块 2.1 插件(Plguin) 2.1.1 插件的作用 2.1.2 插件的类型 2.1.3 插件结构 2. ...

  9. 艾迪普发布新一代国产化“3D引擎+工具+平台”,加速释放数字内容生产力

    ‍数据智能产业创新服务媒体 --聚焦数智 · 改变商业 艾迪普的2023新产品发布会在5月20日在北京隆重举行,该发布会以"向新出发 智见未来"为主题,艾迪普重磅推出了新一代实时三 ...

  10. 【Canvas】HTML5游戏开发的基本流程+P2.js物理引擎实战开发

    <HTML5游戏开发的基本流程> * 1. HTML5的简述 * 2. HTML5游戏开发所需的环境与工具 * 2.1. 开发环境 * 2.1.1. 浏览器 * 2.1.2. 开发语言 * ...

最新文章

  1. 西湖大学鞠峰:环境微生物宏基因组学(报告视频+PPT,11月23日)
  2. asp mvc @Html.CheckBox(sel,true) 往后台传值问题
  3. JS使png背景图片透明
  4. Struts2+Spring传参
  5. C++17尝鲜:类模板中的模板参数自动推导
  6. thinkphp5中使用workerman
  7. Docker容器网络解析
  8. python图像增强_【Tool】Augmentor和imgaug——python图像数据增强库
  9. 无法访问windows安装服务_win7系统提示无法访问windows安装服务如何解决【解决方法】...
  10. c语言220程序,电赛必备220个C语言实例源码分享
  11. Uploadify—借助Uploadify插件实现图片预览时如何解决Chrome浏览器报“喔唷,崩溃啦”
  12. linux 命令行字符缩放,用Linux命令行修图——缩放、编辑、转换格式
  13. Keil与ADS软件冲突问题解决办法
  14. 测绘航空摄影、摄影测量与遥感资质办理
  15. 罗永浩发声:我的努力很可能失败 但好产品一定要赢
  16. ASK,OOK,FSK,GFSK简介
  17. Linux远程连接工具Xmanager Xbrowser--Win10远程连接CentOS6.9桌面
  18. 前端学习之认识HTML
  19. mysql中的left和right
  20. 今日芯声 | 美团王兴回应不支持支付宝:淘宝为什么不支持微信支付?

热门文章

  1. 华为root_传Mate40系列12月率先升级鸿蒙OS 华为官方回应:真相原来是这样
  2. linux和windows的ip区别吗,windows与linux ping 显示的ip不一样
  3. 怎么隐藏li标签_抖音账号如何打标签-7天让抖音账号打上标签
  4. python将txt读入矩阵_python读入txt数据,并转成矩阵
  5. 蜗轮蜗杆计算软件_微型直流电机减速比计算方法
  6. CSS3 详细新增内容
  7. PIE SDK导出图片
  8. 软工网络15个人阅读作业1
  9. 《勿忘初心,不负梦想》
  10. DIY协同办公平台(C/S)系列3之内部邮箱篇