Cocos2dx的作者王哲来到公司给大家做了一场技术答疑会
以下是我及我们项目组的一些Q&A
1. Cocos2dx 3.0版本在引擎退出时, 会有内存泄露
我:本来以为这个在rc1版本中发现的问题会在final版本中解决, 但实际上还是没有解决. 本人使用的是Windows下的VLD的内存泄露检测, 多年来这东西一直没有误报过, 虽然这个泄露不是很大, 但会干扰在这引擎上开发的逻辑的内存泄露查找
王哲:Cocos2dx的内存泄露测试是在XCode下进行的, 借助mac平台的工具来做的, 他说, 虽然操作系统会在进程结束时会自动回收, 但还是会在patch版本解决这个问题.
2. Cocos2dx 3.0 中的getInstance设计问题
我:3.0中的singleton是使用自动new的方式来实现的, 对象都是分配在堆上, 而不是栈上. 这种方式的特点就是在singleton为空时, 自动new出来, 从而让上层保证使用简单. 但是弊端就是前一个问题说过的, 如果处理不当的话, 会导致内存泄露.
3.0中的Director在析构时, 会先删除Configurator的一个配置类, 但是, Renderer在析构时, 又会使用到这个配置类, 调用配置类的单件, 从而导致配置类重新实例化. 之后, 就没有管理配置类的析构, 所以发生内存泄露. 我尝试修复这个问题. 但是因为getInstance本身的设计弊端,导致拆东墙补西墙, 东墙又倒掉的问题.
王哲: 已经发现这个问题, 会在未来版本加以修正
3. 为什么不自带更新系统
王哲: Cocos2dx引擎一开始设计是偏重于渲染器, 所以包括网络及其他部分都是属于附属. 现在开发团队只有10个人, 所以精力也是有限的
另外, 每个公司和个人对更新系统的需求都不是一样的. 不过引擎会在以后版本中的ResourceManager提供一些类似的功能
4. 帧率控制器
我: 游戏一般分为固定帧率和可变帧率两种更新方式. 前者在早期的日本游戏中常见, 后者是3D游戏及后期的游戏中用的比较多. 在U3D中分别使用FixedUpdate和Update两种方法来实现类似的功能. 但是在Cocos2dx中没有实现类似的功能.
王哲: Cocos2dx里因为要处理一些复杂的情况, 比如接听电话之类的, 所以这里仍然使用可变帧率来做.
我: 虚幻里有一套更新算法, 在帧率足时, 击中处理一些垃圾回收, 内存释放等耗时操作. 但是超过预设的阀值后, 停止占用帧更新时间, 留给逻辑足够的更新时间. 但是没看到Cocos2dx内使用这种算法
(其实王哲应该没听懂我说的意思)
王哲: 我尝试在3.0的渲染器中支持多线程, 但是在某些情况会出现crash, 而且这种技术的加入会提高引擎的门槛, 所以未来会根据实际需要加入.
5. 为什么不统一setResourceRootPath/setResourceDirectory 的接口?
这是我们项目的一个兄弟做下载更新时, 碰到的2.0中的一个问题. 王哲表示3.0已经做了1年半, 2.0的东西都忘记了, 但是在3.0中是统一的接口.
6. 如何看待云风喷cocos2dx?
这是我们项目的一知乎粉提的问题. 王哲说, 云风对C++很反感, 所以自己的代码及项目大部分都是C. 因此对cocos2dx这种C++引擎肯定会有些反感. 但是cocos2dx的使用率很高, 不能因为一两个大佬的意见而改变cocos2dx本身的一些优势
7. SpriteFrame和纹理的释放问题, 为什么不使用智能指针?
王哲: 我做过一个测试, 智能指针在移动设备上跑的速度肯定是要慢于retain/release这种手动方式, 所以依然在3.0中采用retain/release方式.
我: 我们有某些资源需要常驻内存, 但是全局方式的SpriteFrameCache和TextureCache会导致这个问题很难解决. 能否提供分组资源管理概念
王哲: 这个修改其实没什么难度, 论坛里也有很多建议, 我们会考虑在新版本支持这些功能
8. Scene的接口不统一, 用错还会crash
王哲: 这个问题确实存在, 我们会加以修正
9. 为什么要对STL进行一些包装, 而不是直接使用?
王哲: 因为要适用于retain/release模式( 此时, 我终于发现我们为什么会出现第七个问题了)
10. string为什么需要一种垃圾回收机制来进行回收, 而不是直接用string?
王哲: 这是一个历史遗留问题, 为了兼容objc版本的移植及风格
其他的一些信息
CocoStudio是使用WPF写的, 底层使用P/Invoke与C++引擎层进行交互. 有人提出这个编辑器要开源么, 作者表示后期会考虑的, 但是因为代码很乱, 所以一开始没有考虑开源
本人感受, 微软的一切开发工具及代码的东西都是按商业模式做的, 根本不考虑开发者的利益. DX7到DX11, 说好的COM兼容, 最后改的一塌糊涂. MFC那么老掉牙的东西, 到VS2013都还在更新, 这不是祸害群主么. XNA退不起来, Silverlight干不过Flash. 更别说乱的一塌糊涂的WP, WindowsRT, WinPhone. 对于VisualStudio来说, 这是地球上做的最好的编辑器, 保留这个足矣, 但是也别太依赖即可. 拥抱开源, 珍惜生命, 远离微软
WP版的Cocos2dx支持是微软设在西雅图的一个叫OpenTech的公司来做的, 并非王哲团队做的. 而且DirectX现在变成小众API, 因此这公司采用AngleProject来用OpenGL模拟DirectX的接口, 当然性能上肯定有很大的损失
最后附上王哲团队的照片以鉴真伪