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

## 问题

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

## 解决

用的龙骨编辑器是最新的 v5.6.2.0001 版本，没有源码，于是尝试用反编译swf的工具来直接修改，用了 [JPEXS Free Flash Decompiler v.14.4.0](https://github.com/jindrapetrik/jpexs-decompiler) 。之前也简单用过这个工具，还挺好用的。

从龙骨编辑器的安装目录中找到 DragonBonesPro.swf，用 JPEXS 打开进行分析。

可以从二进制数据中导出定义本地化字符串的 locales 的 xml。方便从提示的字符串反查字符串ID，再用于搜索相关的代码。

经过测试分析，感觉是编辑器在程序窗口获得焦点时，触发了重新扫描资源库的逻辑，从而引起卡顿。

经过一番研究和尝试之后，想到一个思路是找到窗口获得焦点事件的响应函数，避免执行不必要的会引起卡顿的逻辑。

通过在代码中搜索 Event.ACTIVATE，可以找到 _555.LibraryPanelController 类中的 _1576() 方法，里面有这样一行：
NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE,this._4172);

找到 _4172() 函数
```
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之后的：
```
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 页等其它情况的卡顿，估计这些时候也是触发了扫描资源库的逻辑。不过这样已经解决了困扰最大的问题，就暂时先不动其它地方了。
