解决龙骨工程图片较多时编辑器卡顿的问题
解决龙骨工程图片较多时编辑器卡顿的问题
问题
最近发现龙骨编辑器经常卡顿,特别是切换一下窗口之后就又卡很久,很影响使用。经过排查发现是跟项目资源库中的图片数量和图片大小有关,图片越多越大的话,卡顿就越严重。
解决
用的龙骨编辑器是最新的 v5.6.2.0001 版本,没有源码,于是尝试用反编译swf的工具来直接修改,用了 JPEXS Free Flash Decompiler v.14.4.0 。之前也简单用过这个工具,还挺好用的。
从龙骨编辑器的安装目录中找到 DragonBonesPro.swf,用 JPEXS 打开进行分析。
可以从二进制数据中导出定义本地化字符串的 locales 的 xml。方便从提示的字符串反查字符串ID,再用于搜索相关的代码。
经过测试分析,感觉是编辑器在程序窗口获得焦点时,触发了重新扫描资源库的逻辑,从而引起卡顿。
经过一番研究和尝试之后,想到一个思路是找到窗口获得焦点事件的响应函数,避免执行不必要的会引起卡顿的逻辑。
通过在代码中搜索 Event.ACTIVATE
,可以找到 _555.LibraryPanelController
类中的 _1576()
方法,里面有这样一行:
1 | NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE,this._4172); |
找到 _4172()
函数
1 | private function _4172(param1:Event) : void |
意思是当窗口获得焦点时执行这个逻辑,那只要通过修改让它不执行就好了。
由于 JPEXS 直接编辑 ActionScript 的功能还是实验性阶段,所以保险起见直接用编辑 P-code 功能进行修改。P-code 大概就相当于 ActionScript 的汇编语言。
这个 if 语句对应的 P-code 中有一句 iffalse ofs0012
来控制跳转。用了一个最简单的改法:把 iffalse
改成 iftrue
。对应的就是相当于把 ActionScript 中的 if(this._4158._2871)
改成 if(!this._4158._2871)
。
修改之后点击保存,再从 JPEXS 的文件选项中对整体文件进行保存。
然后用修改后的 DragonBonesPro.swf 文件覆盖掉龙骨编辑器目录中的原始文件即可。
其它思考
另一个方法是简单的将 _1576() 方法中注册事件的这一行删掉应该也行:NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE,this._4172);
对应删掉的 P-code 是 ofs006a之后的:
1 | getlex QName(PackageNamespace("flash.desktop"),"NativeApplication") |
遗留问题
这样解决了编辑器程序窗口获得焦点时的卡顿问题,并没有解决编辑器程序中切换工程 Tab 页等其它情况的卡顿,估计这些时候也是触发了扫描资源库的逻辑。不过这样已经解决了困扰最大的问题,就暂时先不动其它地方了。