<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Arnan's Blog]]></title><description><![CDATA[Arnan's Blog]]></description><link>https://blog.arnan.link</link><generator>RSS for Node</generator><lastBuildDate>Tue, 05 May 2026 13:30:07 GMT</lastBuildDate><atom:link href="https://blog.arnan.link/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[解决龙骨工程图片较多时编辑器卡顿的问题]]></title><description><![CDATA[问题
最近发现龙骨编辑器经常卡顿，特别是切换一下窗口之后就又卡很久，很影响使用。经过排查发现是跟项目资源库中的图片数量和图片大小有关，图片越多越大的话，卡顿就越严重。
解决
用的龙骨编辑器是最新的 v5.6.2.0001 版本，没有源码，于是尝试用反编译swf的工具来直接修改，用了 JPEXS Free Flash Decompiler v.14.4.0 。之前也简单用过这个工具，还挺好用的。
从龙骨编辑器的安装目录中找到 DragonBonesPro.swf，用 JPEXS 打开进行分析。
可...]]></description><link>https://blog.arnan.link/6kej5yaz6b6z6aqo5bel56il5zu54mh6l6d5asa5pe257yw6l6r5zmo5y2h6ag55qe6zeu6aky</link><guid isPermaLink="true">https://blog.arnan.link/6kej5yaz6b6z6aqo5bel56il5zu54mh6l6d5asa5pe257yw6l6r5zmo5y2h6ag55qe6zeu6aky</guid><dc:creator><![CDATA[LuNan Sheng]]></dc:creator><pubDate>Fri, 02 Jul 2021 13:41:10 GMT</pubDate><content:encoded><![CDATA[<h2 id="6zeu6aky">问题</h2>
<p>最近发现龙骨编辑器经常卡顿，特别是切换一下窗口之后就又卡很久，很影响使用。经过排查发现是跟项目资源库中的图片数量和图片大小有关，图片越多越大的话，卡顿就越严重。</p>
<h2 id="6kej5yaz">解决</h2>
<p>用的龙骨编辑器是最新的 v5.6.2.0001 版本，没有源码，于是尝试用反编译swf的工具来直接修改，用了 <a target="_blank" href="https://github.com/jindrapetrik/jpexs-decompiler">JPEXS Free Flash Decompiler v.14.4.0</a> 。之前也简单用过这个工具，还挺好用的。</p>
<p>从龙骨编辑器的安装目录中找到 DragonBonesPro.swf，用 JPEXS 打开进行分析。</p>
<p>可以从二进制数据中导出定义本地化字符串的 locales 的 xml。方便从提示的字符串反查字符串ID，再用于搜索相关的代码。</p>
<p>经过测试分析，感觉是编辑器在程序窗口获得焦点时，触发了重新扫描资源库的逻辑，从而引起卡顿。</p>
<p>经过一番研究和尝试之后，想到一个思路是找到窗口获得焦点事件的响应函数，避免执行不必要的会引起卡顿的逻辑。</p>
<p>通过在代码中搜索 Event.ACTIVATE，可以找到 _555.LibraryPanelController 类中的 _1576() 方法，里面有这样一行：
NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE,this._4172);</p>
<p>找到 _4172() 函数</p>
<pre><code><span class="hljs-keyword">private</span> function _4172(param1:Event) : void
{
   <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>._4158._2871)
   {
      <span class="hljs-keyword">this</span>._4188();
   }
}
</code></pre><p>意思是当窗口获得焦点时执行这个逻辑，那只要通过修改让它不执行就好了。</p>
<p>由于 JPEXS 直接编辑 ActionScript 的功能还是实验性阶段，所以保险起见直接用编辑 P-code 功能进行修改。P-code 大概就相当于 ActionScript 的汇编语言。</p>
<p>这个 if 语句对应的 P-code 中有一句 <code>iffalse ofs0012</code> 来控制跳转。用了一个最简单的改法：把 <code>iffalse</code> 改成 <code>iftrue</code>。对应的就是相当于把 ActionScript 中的 <code>if(this._4158._2871)</code> 改成 <code>if(!this._4158._2871)</code>。</p>
<p>修改之后点击保存，再从 JPEXS 的文件选项中对整体文件进行保存。
然后用修改后的 DragonBonesPro.swf 文件覆盖掉龙骨编辑器目录中的原始文件即可。</p>
<h2 id="5yw25a6d5ocd6icd">其它思考</h2>
<p>另一个方法是简单的将 _1576() 方法中注册事件的这一行删掉应该也行：
<code>NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE,this._4172);</code></p>
<p>对应删掉的 P-code 是 ofs006a之后的：</p>
<pre><code><span class="hljs-selector-tag">getlex</span> <span class="hljs-selector-tag">QName</span>(PackageNamespace(<span class="hljs-string">"flash.desktop"</span>),<span class="hljs-string">"NativeApplication"</span>)
<span class="hljs-selector-tag">getproperty</span> <span class="hljs-selector-tag">QName</span>(PackageNamespace(<span class="hljs-string">""</span>),<span class="hljs-string">"nativeApplication"</span>)
<span class="hljs-selector-tag">getlex</span> <span class="hljs-selector-tag">QName</span>(PackageNamespace(<span class="hljs-string">"flash.events"</span>),<span class="hljs-string">"Event"</span>)
<span class="hljs-selector-tag">getproperty</span> <span class="hljs-selector-tag">QName</span>(PackageNamespace(<span class="hljs-string">""</span>),<span class="hljs-string">"ACTIVATE"</span>)
<span class="hljs-selector-tag">getlocal0</span>
<span class="hljs-selector-tag">getproperty</span> <span class="hljs-selector-tag">QName</span>(PrivateNamespace(null,<span class="hljs-string">"48"</span>),<span class="hljs-string">"_4172"</span>)
<span class="hljs-selector-tag">callpropvoid</span> <span class="hljs-selector-tag">QName</span>(PackageNamespace(<span class="hljs-string">""</span>),<span class="hljs-string">"addEventListener"</span>), <span class="hljs-selector-tag">2</span>
</code></pre><h2 id="6ygx55wz6zeu6aky">遗留问题</h2>
<p>这样解决了编辑器程序窗口获得焦点时的卡顿问题，并没有解决编辑器程序中切换工程 Tab 页等其它情况的卡顿，估计这些时候也是触发了扫描资源库的逻辑。不过这样已经解决了困扰最大的问题，就暂时先不动其它地方了。</p>
]]></content:encoded></item></channel></rss>