遇到的问题
最近一直在围绕cocos2dx进行相关开发,项目中最近刚好出现一个界面显示异常的问题,但是这部分的代码我并不是非常的熟悉,而且代码量有点大。
其实我是很排斥从头review这部分代码的,毕竟需要看明白原有逻辑,然后再不停的debug才能真正定位到问题。
经验告诉我,一般这种问题,大概率是position、scale、visible、size、opacity等属性导致的,通过检查这些属性,基本就能把问题定位到,如果这些属性没问题,这问题就比较棘手了。
为了快速排查定位到问题,我认为项目需要类似inspector
这样的辅助工具,而且我也有至少2款inspector
的开发经历,所以我决定开发一个inspector
。
问题分析
开发editor使用的framework
如今开发桌面应用首选Electron
,使用web前端技术栈开发桌面应用,开发效率杠杠的,只管梭就行了,并且有VsCode、CocosCreator等成熟产品得到了印证,但是因为Cocos2dx
采用C++编写,没有合适的办法和Electron
融合,修改源码的代价有点hold不住,所以这个方案也被我否定了。
采用C++
开发桌面应用,可选的解决方案也不是太多,cocos studio
选择的是mono,开发语言使用c#,我不太熟悉,也不太擅长,所以,直接否定了这个方案。
本着尽量少使用不同语言就能达成目的,所以可选项也就锁定在MFC、QT。
这两个方案网上都有教程,感觉MFC(没饭吃)已经是非常老的技术了,而且在跨平台方面,QT综合来看是个不错的选择。
最后还是决定使用QT,将cocos2dx
嵌入还是有一定难度,好在网上查查资料,都顺利解决了。
这里我并没有使用Qt Creator
进行开发,而是使用了Qt Visual Studio Tools
,主要原因是目前并没有发布Mac的需求,对Visual Studio
也比较熟悉,配置起来更加得心应手。
编写编辑器的各种面板
将引擎嵌入到Qt之后,就需要开发编辑器相关的功能啦,这也是编辑器工作的工作重心之一,工作量不容小觑。
使用Qt
提供的GUI控件肯定不行,开发效率跟不上,而且很多复合组件还需要自己手动撸,后期一定痛苦的不要不要的。
虽然Qt也推出了QML
开发方式,但是和传统的web开发相比,还是有点另类,况且我也不想学很多杂七杂八的零碎技术栈,使用的技术越杂,维护的成本也就越高,但是我还是希望解决方案能够满足尽可能多的需求,矛盾又不矛盾。
后来我想到了Qt有webview
控件,我可以编写一个web页面,然后放到webview控件里面,这样子就能和Qt整合在一起,不过web页面就不能像Electron
那样使用nodejs的特性啦,有舍必有得嘛!
说干就干,别说,最终的效果还是挺让我满意的,感觉这个方向没错。
编辑器的数据通讯
这就稍微有点麻烦了,引擎是c++,编辑器面板是js,中间的桥梁是webview,虽然Qt也提供了通过QChanel进行通讯,但是后来发现其实并不是太好用。
首先我必须在web页面引入QChanel.js,里面包含了一些Qt的全局变量,导致我在使用vue开发打包的时候需要额外的处理。
其次,项目里面有使用lua,lua层要和js进行通讯,QChanel的方案非常的麻烦,web页面通过QChanel访问到Qt,到达C++层后,通过Lua binding逆向访问Lua,绕了一圈,脑壳痛!
所以,我在想有啥更优的解决方案么?
数据通讯解决方案
当我还在Cocos
工作的时候,也做过这方面的探索,方案也是Qt,同样也是卡在这里,网上各种搜资料,当然是大海捞针,一无所获。
中间工位发生了一次变化,也就是这次变化,让我得到了这个问题的一个解决方案:
因为距离公司的书柜更近了,一抬头就能看到里面都有什么技术书籍,刚好看到一本网易出的书籍,想着大厂出的书肯定牛逼,感觉还是有必要刷一刷,虽然我基本很少看技术书籍。
本着随便翻一翻的态度,不曾想竟然在里面得到了答案,里面有一章节专门介绍网易内部的游戏编辑器架构,他们的梦幻西游编辑器是用Python Qt,引擎是c++,只要是2种不同的语言,肯定要牵扯通讯问题,书中写到为了保证足够的通用性和灵活性,通讯这块他们使用了Socket!
很久之前我写的一个inspector
插件就这么干过,在我完成 cc-inspector for chrome
版本的开发后,我当时认为chrome插件的调试场景覆盖不到非H5环境,所以后来就开发了这个cc-inspector+
当时我还以为这种方法有点业余,怕被耻笑,现在看来,竟然和网易大佬们的想法不谋而合,这种被认同的感觉,让我瞬间对这个方案充满了信心。
说干就干,现在就是验证这个想法的绝好机会,经过几天的摸索,成功把整个通讯流程跑通了,这种通过网络进行隔离的方案,让我在开发web页面的时候,完全可以在浏览器中完成页面的编写,几乎和开发正常的网页没有区别,HMR(hot module replacement)简直爽的不要不要,开发效率和开发体验直接起飞。
总结一下目前的编辑器方案
使用Qt开发编辑器,将引擎嵌入进去,然后各种编辑器面板就运行在QWebview中。
把这个QWebview
放到QDockWidget
中,就可以实现面板的各种浮动停靠,就像unity那种丝滑。
引擎和面板之间通过网络进行交互,即使以后更换引擎,我只需要对接网络接口就可以啦,更换引擎C++就很好对接啦,HTML5引擎,同样使用QWebview包起来就行啦。
你可能要说性能问题,的确存在,但是对于我目前的情况,这个不是重点,这套技术架构完全能支撑一段时间。
采用web编写GUI应该已经是时下流行的解决方案,香喷喷!
我就是通过写Cocos Creator
插件入坑web前端的。
不过目前也有部分不太舒服的地方,就是不能使用nodejs,不过总体来说我已经很满意了,开发出来的编辑器公司的同事反馈良好,在一定程度上对项目的起到了实质性便利。
总的来说,最近半年还是收获满满。