解决龙骨工程图片较多时编辑器卡顿的问题

问题

最近发现龙骨编辑器经常卡顿,特别是切换一下窗口之后就又卡很久,很影响使用。经过排查发现是跟项目资源库中的图片数量和图片大小有关,图片越多越大的话,卡顿就越严重。

解决

用的龙骨编辑器是最新的 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
2
3
4
5
6
7
private function _4172(param1:Event) : void
{
if(this._4158._2871)
{
this._4188();
}
}

意思是当窗口获得焦点时执行这个逻辑,那只要通过修改让它不执行就好了。

由于 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
2
3
4
5
6
7
getlex QName(PackageNamespace("flash.desktop"),"NativeApplication")
getproperty QName(PackageNamespace(""),"nativeApplication")
getlex QName(PackageNamespace("flash.events"),"Event")
getproperty QName(PackageNamespace(""),"ACTIVATE")
getlocal0
getproperty QName(PrivateNamespace(null,"48"),"_4172")
callpropvoid QName(PackageNamespace(""),"addEventListener"), 2

遗留问题

这样解决了编辑器程序窗口获得焦点时的卡顿问题,并没有解决编辑器程序中切换工程 Tab 页等其它情况的卡顿,估计这些时候也是触发了扫描资源库的逻辑。不过这样已经解决了困扰最大的问题,就暂时先不动其它地方了。