<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>Synchronous Space</title><description>Beyond the World, synchronize with the Universe.</description><managingEditor>noreply@blogger.com (Stephen)</managingEditor><pubDate>Fri, 6 Sep 2024 12:59:56 +0900</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">138</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://syncspace.blogspot.com/</link><language>en-us</language><item><title>[AS3]详解E4X的变量展开(3)——效率与实用性</title><link>http://syncspace.blogspot.com/2008/06/as3e4x3.html</link><category>actionscript</category><category>E4X</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sun, 22 Jun 2008 22:29:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-4116189731779273531</guid><description>&lt;p&gt;续&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://syncspace.blogspot.com/2008/06/as3e4x1.html"&gt;[AS3]E4X的变量展开详解(1)——基础&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://syncspace.blogspot.com/2008/06/as3e4x2.html"&gt;[AS3]详解E4X的变量展开(2)——内部实现&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;从上一篇文章可以看出使用 E4X 变量展开要慢于 &lt;code&gt;new String&lt;/code&gt;。因为 E4X 是先把字符串转换为 XML(XMLList) 再转换为字符串。在解析字符串时开销很大。下面是测试的结果：&lt;/p&gt;&lt;table border="1" align="center" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;div align="center"&gt;方式&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;第1次&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;第2次&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;第3次&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;第4次&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;第5次&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;平均&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;div align="center"&gt;E4X 变量展开&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;1008&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;1490&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;959&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;1037&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;959&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;1091&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;div align="center"&gt;new String&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;135&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;110&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;125&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;111&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;117&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="center"&gt;120&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;(E4X 变量展开的代码为：&lt;code&gt;&amp;lt;&amp;gt;abc{1+2}def&amp;lt;/&amp;gt;.toString()&lt;/code&gt;，new String 的代码为：&lt;code&gt;&amp;quot;abc&amp;quot; + (1+2) + &amp;quot;def&amp;quot;&lt;/code&gt;；循环次数为10000次；单位：ms。)&lt;/p&gt;&lt;p&gt;由此可见 E4X 变量展开的效率要差一些，但不在大量的循环里的时候差别不是很明显。因为这里的差别是循环 10000 次的结果，执行一次的差别仅仅为 0.097(ms)，是可以忽略不计的。因此 E4X 变量展开还是很有用的。&lt;/p&gt;&lt;p&gt;比如说以下代码(预载入文本)：&lt;/p&gt;&lt;p&gt;E4X 变量展开的格式：&lt;/p&gt;
&lt;pre&gt;&lt;span style="font-weight: bold"&gt;e4xStr(&amp;lt;&amp;gt;Loading... {loaded}K/{total}K ({loaded/total*100}%)&amp;lt;/&amp;gt;)&lt;/span&gt;
//e4xStr 为
function e4xStr(e4x:XMLList):String {
  return e4x.toString();
}&lt;/pre&gt;&lt;p&gt;new String 的格式：&lt;/p&gt;&lt;pre&gt;&amp;quot;Loading... &amp;quot; + loaded + &amp;quot;K/&amp;quot; + total + &amp;quot;K (&amp;quot; + (loaded/total*100) + &amp;quot;%)&amp;quot;&lt;/pre&gt;&lt;p&gt;由此可见 E4X 变量展开的可读性要大大高于new String 的格式。因为预载入文本一般为每一帧执行一次，所以说一般不会遇到效率的瓶颈。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]详解E4X的变量展开(2)——内部实现</title><link>http://syncspace.blogspot.com/2008/06/as3e4x2.html</link><category>actionscript</category><category>E4X</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sun, 15 Jun 2008 23:39:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-2485664128948931445</guid><description>&lt;p&gt;续&lt;a href="http://syncspace.blogspot.com/2008/06/as3e4x1.html"&gt;[AS3]E4X的变量展开详解(1)——基础&lt;/a&gt;，下面来研究E4X变量展开的内部实现。&lt;/p&gt;
&lt;p&gt;源文件：&lt;/p&gt;
&lt;pre&gt;var a = &amp;lt;a&amp;gt;abc{123}def&amp;lt;/a&amp;gt;;&lt;/pre&gt;
&lt;p&gt;使用 abcdump 反编译后的结果：&lt;/p&gt;
&lt;pre&gt; 0        getlocal0&lt;br /&gt; 1        pushscope&lt;br /&gt; 2        findpropstrict      XML&lt;br /&gt; 4        getproperty         XML&lt;br /&gt; 6        pushstring          &amp;quot;&amp;lt;a&amp;gt;abc&amp;quot;&lt;br /&gt; 8        pushbyte            123&lt;br /&gt;10        esc_xelem&lt;br /&gt;11        add&lt;br /&gt;12        pushstring          &amp;quot;def&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;14        add&lt;br /&gt;15        construct           (1)&lt;br /&gt;17        getglobalscope&lt;br /&gt;18        swap&lt;br /&gt;19        setslot             1&lt;br /&gt;21        returnvoid&lt;/pre&gt;
&lt;h3&gt;与 &lt;code&gt;new String()&lt;/code&gt; 做比较&lt;/h3&gt;
&lt;p&gt;源文件：&lt;/p&gt;
&lt;pre&gt;var a = new String(&amp;quot;a&amp;quot;)&lt;/pre&gt;
&lt;p&gt;使用 abcdump 反编译后的结果：&lt;/p&gt;
&lt;pre&gt; 0        getlocal0&lt;br /&gt; 1        pushscope&lt;br /&gt; 2        findpropstrict      String&lt;br /&gt; 4        pushstring          &amp;quot;a&amp;quot;&lt;br /&gt; 6        constructprop       String (1)&lt;br /&gt; 9        getglobalscope&lt;br /&gt;10        swap&lt;br /&gt;11        setslot             1&lt;br /&gt;13        returnvoid&lt;/pre&gt;
&lt;p&gt;会发现 E4X 与 &lt;code&gt;new String()&lt;/code&gt; 很相似。&lt;/p&gt;
&lt;h3&gt;先来看压栈的部分&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;new String()&lt;/code&gt; 的为：&lt;/p&gt;
&lt;pre&gt;4        pushstring          &amp;quot;a&amp;quot;&lt;br /&gt;6        constructprop       String (1)&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;new String()&lt;/code&gt; 是先把 &lt;code&gt;&amp;quot;a&amp;quot;&lt;/code&gt; 压入堆栈，再调用构造函数。&lt;/p&gt;
&lt;p&gt;而 E4X 的为：&lt;/p&gt;
&lt;pre&gt; 6        pushstring          &amp;quot;&amp;lt;a&amp;gt;abc&amp;quot;&lt;br /&gt; 8        pushbyte            123&lt;br /&gt;10        esc_xelem&lt;br /&gt;11        add&lt;br /&gt;12        pushstring          &amp;quot;def&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;14        add&lt;br /&gt;15        construct           (1)&lt;/pre&gt;
&lt;p&gt;有点复杂，过程为：&lt;/p&gt;
&lt;p&gt;1.把 &lt;code&gt;&amp;quot;&amp;lt;a&amp;gt;abc&amp;quot;&lt;/code&gt; 压入堆栈(第6行)&lt;/p&gt;
&lt;table width="50" border="1" cellspacing="0" cellpadding="0" align="center"&gt;
&lt;tr&gt;&lt;td&gt;&amp;quot;&amp;lt;a&amp;gt;abc&amp;quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;div align="center"&gt;XML&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;2.把 &lt;code&gt;123&lt;/code&gt; 压入堆栈(第8行)&lt;/p&gt;
&lt;table width="50" border="1" cellspacing="0" cellpadding="0" align="center"&gt;
&lt;tr&gt;
 &lt;td&gt;&lt;div align="center"&gt;
  123
 &lt;/div&gt;&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;&amp;quot;&amp;lt;a&amp;gt;abc&amp;quot;&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;&lt;div align="center"&gt;
 XML
&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;3.把 栈顶(这里为 &lt;code&gt;123&lt;/code&gt;)转换为 &lt;code&gt;String&lt;/code&gt;。(第10行) esc_xelem 相当于 &lt;code&gt;toXMLString(123)&lt;/code&gt; &lt;span class="ps"&gt;*注意 &lt;code&gt;toXMLString&lt;/code&gt; 为内部函数，无法调用。&lt;/span&gt;&lt;/p&gt;
&lt;table width="50" border="1" cellspacing="0" cellpadding="0" align="center"&gt;
&lt;tr&gt;
 &lt;td&gt;&lt;div align="center"&gt;
  &amp;quot;123&amp;quot;
 &lt;/div&gt;&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;&amp;quot;&amp;lt;a&amp;gt;abc&amp;quot;&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;&lt;div align="center"&gt;
 XML
&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;4.把堆栈的栈顶的两项相加。(第11行)&lt;/p&gt;
&lt;table width="50" border="1" cellspacing="0" cellpadding="0" align="center"&gt;&lt;tr&gt;
 &lt;td&gt;&amp;quot;&amp;lt;a&amp;gt;abc123&amp;quot;&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;&lt;div align="center"&gt;
 XML
&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;5.把 &lt;code&gt;&amp;quot;def&amp;lt;/a&amp;gt;&amp;quot;&lt;/code&gt; 压入堆栈(第12行)&lt;/p&gt;
&lt;table width="50" border="1" cellspacing="0" cellpadding="0" align="center"&gt;
 &lt;tr&gt;
  &lt;td&gt;&lt;div align="center"&gt;   &amp;quot;def&amp;lt;/a&amp;gt;&amp;quot;
  &lt;/div&gt;  &lt;/td&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;quot;&amp;lt;a&amp;gt;abc123&amp;quot;&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;&lt;div align="center"&gt;
 XML
&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;6.把堆栈的栈顶的两项相加。(第14行)&lt;/p&gt;
&lt;table width="50" border="1" cellspacing="0" cellpadding="0" align="center"&gt;&lt;tr&gt;
 &lt;td&gt;&amp;quot;&amp;lt;a&amp;gt;abc123def&amp;lt;/a&amp;gt;&amp;quot;&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;&lt;div align="center"&gt;
 XML
&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;7.调用构造函数。(第15行)即返回 &lt;code&gt;new XML(&amp;quot;&amp;lt;a&amp;gt;abc123def&amp;lt;/a&amp;gt;&amp;quot;)&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;pre&gt;&amp;lt;a&amp;gt;abc{123}def&amp;lt;/a&amp;gt;;&lt;/pre&gt;
&lt;p&gt;就相当于&lt;/p&gt;
&lt;pre&gt;new XML(&amp;quot;&amp;lt;a&amp;gt;abc&amp;quot; + toXMLString(123) + &amp;quot;def&amp;lt;/a&amp;gt;&amp;quot;);&lt;/pre&gt;
&lt;p&gt;最后，关于AVM2的格式可以参照&lt;a href="http://www.anotherbigidea.com/javaswf/avm2/AVM2Instructions.html"&gt;AVM2 Instructions&lt;/a&gt;，不明白的语句可以去查一查。&lt;/p&gt;
&lt;p&gt;未完待续，下一篇详解&lt;a href="http://syncspace.blogspot.com/2008/06/as3e4x3.html"&gt;效率与实用性&lt;/a&gt;。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]E4X的变量展开详解(1)——基础</title><link>http://syncspace.blogspot.com/2008/06/as3e4x1.html</link><category>actionscript</category><category>E4X</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sat, 14 Jun 2008 21:40:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-7614927078239870293</guid><description>&lt;p&gt;在 E4X 里可以使用 &lt;code&gt;{}&lt;/code&gt; 来进行变量展开。比如下以下代码：&lt;/p&gt;
&lt;pre&gt;var foo:String = &amp;quot;123&amp;quot;;
trace(&amp;lt;&amp;gt;abc{foo}def&amp;lt;/&amp;gt;.toString());// -&amp;gt; abc123def&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;{}&lt;/code&gt; 里面可以为在执行期才知道的变量：&lt;/p&gt;
&lt;pre&gt;var foo:String = Math.random().toSTring();
trace(&amp;lt;&amp;gt;abc{foo}def&amp;lt;/&amp;gt;.toString());&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;{}&lt;/code&gt; 还可以使用表达式(运算符、调用函数，etc.)：&lt;/p&gt;
&lt;pre&gt;var foo:String = &amp;quot;123&amp;quot;;
trace(&amp;lt;&amp;gt;{foo + foo}&amp;lt;/&amp;gt;.toString());// -&amp;gt; 123123
//比较复杂一点的
trace(&amp;lt;&amp;gt;{foo += &amp;quot;456&amp;quot;, foo+&amp;quot;789&amp;quot;}&amp;lt;/&amp;gt;.toString());// -&amp;gt; 123456789
//调用函数
trace(&amp;lt;&amp;gt;{foo.substr(1)}&amp;lt;/&amp;gt;.toString());// -&amp;gt; 23&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;{}&lt;/code&gt; 里无法使用语句，但可以使用匿名函数来代替：&lt;/p&gt;
&lt;pre&gt;var foo:String = &amp;quot;123&amp;quot;;
trace(&amp;lt;&amp;gt;{(function(a){return a + a})(foo)}&amp;lt;/&amp;gt;.toString());// -&amp;gt; 123123&lt;/pre&gt;
&lt;p&gt;使用 E4X 会减少一些代码，方便书写，但&lt;span class="ps"&gt;注意 &lt;code&gt;&amp;lt;&amp;gt;&amp;lt;/&amp;gt;&lt;/code&gt; 的类型为 &lt;code&gt;XMLList&lt;/code&gt;&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;最后给一个方便的函数：&lt;/p&gt;
&lt;pre&gt;public function e4xstr(e4x:XMLList):String {
  return e4x.toString();
}
//用法
var a:int = 3;
var b:int = 5;
trace(e4xstr(&amp;lt;&amp;gt;a+b={a+b}, a*b={a*b}&amp;lt;/&amp;gt;)); // -&amp;gt; a+b=8, a*b=15&lt;/pre&gt;
&lt;p&gt;未完待续，下一篇详解 &lt;a href="http://syncspace.blogspot.com/2008/06/as3e4x2.html"&gt;E4X 的内部实现&lt;/a&gt;。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]逻辑和(&amp;amp;&amp;amp;)与逻辑或(||)的妙用</title><link>http://syncspace.blogspot.com/2008/06/as3.html</link><category>actionscript</category><category>逻辑运算符</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sat, 7 Jun 2008 21:38:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-5924849342849987900</guid><description>&lt;p&gt;使用 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 与 &lt;code&gt;||&lt;/code&gt; 可以简化代码，提高可读性。比如以下代码：&lt;/p&gt;
&lt;pre&gt;var foo:Boolean = true;
var bar:Object = {};
trace(foo &amp;amp;&amp;amp; bar);  // -&amp;gt; [object Object]
trace(foo || bar);  // -&amp;gt; true&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 与 &lt;code&gt;||&lt;/code&gt; 的结果是由运算符的左边的项目(这里是 &lt;code&gt;foo&lt;/code&gt; )来决定的。简单地说，规则为：&lt;/p&gt;
&lt;pre&gt;A &amp;amp;&amp;amp; B : 如果 Boolean(A) 为 &lt;strong&gt;false&lt;/strong&gt; 则返回 A，否则返回 B。
A || B : 如果 Boolean(A) 为 &lt;strong&gt;true&lt;/strong&gt; 则返回 A，否则返回 B。&lt;/pre&gt;
&lt;p&gt;所以实际上并没有进行真正数学意义上的逻辑运算，返回值也不一定是 &lt;code&gt;Boolean&lt;/code&gt; 值。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Boolean(A)&lt;/code&gt; 的转换规则如下：&lt;/p&gt;
&lt;pre&gt;Undefiend  ： false
Null   ： false
Boolean  ： 与转换前相同
Number   ： 0 或 NaN 为 false 替其他的为 true
String   ： 空串为 false  其他的为 true
Object   ： true&lt;/pre&gt;
&lt;h3&gt;使用逻辑运算符简化代码&lt;/h3&gt;
&lt;p&gt;使用逻辑运算符可以简化简单的逻辑判断(&lt;code&gt;if&lt;/code&gt;)。&lt;/p&gt;
&lt;pre&gt;//1. 使用 if
if (foo) {
  doSomething();
}
if (！bar) {
  doSomething2();
}

//2. 使用逻辑运算符
foo &amp;amp;&amp;amp; doSomething()；
bar || doSomething2()；&lt;/pre&gt;
&lt;p&gt;多重 &lt;code&gt;if&lt;/code&gt; 的写法：&lt;/p&gt;
&lt;pre&gt;//1. 使用 if
if (foo) {
  if (bar) {
    sayHello();
  }
}
 
//2. 使用 if 与逻辑运算符
if (foo &amp;amp;&amp;amp; bar) {
  sayHello()；
}

//3. 只使用逻辑运算符
foo &amp;amp;&amp;amp; bar &amp;amp;&amp;amp; sayHello();     &lt;/pre&gt;
&lt;p&gt;虽然 &lt;code&gt;else&lt;/code&gt; 也可以实现，但代码有可能变得难一閲读。&lt;/p&gt;
&lt;h3&gt;&amp;amp;&amp;amp;= 与 ||=&lt;/h3&gt;
&lt;p&gt;在需要代入结果时，使用 &lt;code&gt;&amp;amp;&amp;amp;=&lt;/code&gt; 与 &lt;code&gt;||=&lt;/code&gt; 更方便。&lt;/p&gt;
&lt;pre&gt;//1. 使用 if
if (foo) {
  foo =  &amp;quot;&amp;lt;&amp;quot; + foo + &amp;quot;/&amp;gt;&amp;quot;;
}

//2. 使用逻辑运算&lt;br /&gt;foo &amp;amp;&amp;amp;= &amp;quot;&amp;lt;&amp;quot; + foo + &amp;quot;/&amp;gt;&amp;quot;; &lt;/pre&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>我的 Blog 的 Google PR 上升为 7！</title><link>http://syncspace.blogspot.com/2008/04/blog-google-pr-7.html</link><category>Blogger</category><author>noreply@blogger.com (Stephen)</author><pubDate>Wed, 30 Apr 2008 20:46:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-6459913063317714008</guid><description>&lt;p&gt;在 2008-4 的 Google PR 的更新里我的 Blog 已经上升为7了。&lt;/p&gt;&lt;p&gt;在这里感谢大家对我的支持。&lt;/p&gt;&lt;p&gt;再请大家多多关注一下我的另一个 Blog —— &lt;a href="http://assnippets.blogspot.com/"&gt;ActionScript Snippets&lt;/a&gt; - 一个专门收集 AS 代码的 Blog，它的 PR 也上升为了3。
&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]ActionScript 中数组的访问的 BUG</title><link>http://syncspace.blogspot.com/2008/04/as3actionscript-bug.html</link><category>actionscript</category><category>Bug</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sun, 27 Apr 2008 23:29:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-2782452578583225966</guid><description>&lt;p&gt;&lt;span class="ps"&gt;重要度：(3/5)&lt;/span&gt; 这个问题看似简单，但 debug 时却难以发现。&lt;/p&gt;
&lt;p&gt;数组访问时如果下标使用了函数并且使用了 &lt;code&gt;+=&lt;/code&gt;、&lt;code&gt;-=&lt;/code&gt;、&lt;code&gt;*=&lt;/code&gt; 等运算符时需要特别地注意，函数会被调用两次！&lt;/p&gt;
&lt;p&gt;比如以下代码：&lt;/p&gt;
&lt;pre&gt;
var i:int = 0;
var foo = function():int {
trace("foo")；
return ++i;
}
var arr:Array = [1,2,3];
arr[foo()] += 10;
trace(arr)；&lt;/pre&gt;
&lt;p&gt;将会输出：&lt;/p&gt;
&lt;pre&gt;foo;
foo;
1,13,3&lt;/pre&gt;
&lt;p&gt;而正确的输出为：&lt;/p&gt;
&lt;pre&gt;foo;
1,12,3&lt;/pre&gt;
&lt;p&gt;这是因为在编译时编译器只做了一下简单的操作：&lt;/p&gt;
&lt;pre&gt;(a += b) --&amp;gt; (a) = (a) + (b)&lt;/pre&gt;
&lt;p&gt;以至于将 &lt;code&gt;arr[foo()] += 10;&lt;/code&gt; 编译成 &lt;code&gt;arr[foo()] = arr[foo()] + 10;&lt;/code&gt;。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]mxmlc 编译器的 BUG</title><link>http://syncspace.blogspot.com/2008/04/as3mxmlc-bug.html</link><category>actionscript</category><category>Bug</category><category>mxmlc</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sun, 6 Apr 2008 21:00:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-5276966188934721987</guid><description>&lt;p class="ps"&gt;PS：因为最近很忙，好久没有更新 Blog 了。&lt;/p&gt;&lt;p&gt;最近发现了一个 mxmlc 编译器的 BUG，当含有 &lt;code&gt;-(true ? 1 : 0)&lt;/code&gt; 的代码编译会出错。&lt;/p&gt;&lt;p&gt;比如以下代码：&lt;/p&gt;&lt;pre&gt;package {&lt;br /&gt; import flash.display.Sprite;&lt;br /&gt; public class TestBUG extends Sprite {&lt;br /&gt;  &lt;br /&gt;  public function TestBUG() {&lt;br /&gt;   trace('Test');&lt;br /&gt;   var foo:Number = -(true ? 1 : 0);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;使用 mxmlc 编译时会弹出错误：&lt;/p&gt;&lt;pre&gt;Error: null
java.lang.NullPointerException
  at macromedia.asc.semantics.ConstantEvaluator.evaluate(ConstantEvaluator.java:1168)
  at macromedia.asc.parser.UnaryExpressionNode.evaluate(UnaryExpressionNode.java:33)
  at macromedia.asc.semantics.ConstantEvaluator.evaluate(ConstantEvaluator.java:1805)
......&lt;/pre&gt;&lt;p&gt;&lt;span class="ps"&gt;但把 &lt;code&gt;-(true ? 1 : 0)&lt;/code&gt; 的 &lt;code&gt;-&lt;/code&gt; 号去掉后编译却可以正常进行&lt;/span&gt;，真奇怪！&lt;/p&gt;&lt;h3&gt;影响的版本：&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;2.0&lt;/li&gt;&lt;li&gt;2.0.1&lt;/li&gt;&lt;li&gt;3.0.0&lt;/li&gt;&lt;/ul&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>[Flash Player]2008年4月的 Flash Player 的安全策略的变化</title><link>http://syncspace.blogspot.com/2008/03/flash-player20084-flash-player.html</link><category>flash player</category><author>noreply@blogger.com (Stephen)</author><pubDate>Thu, 20 Mar 2008 17:28:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-3472161625880304003</guid><description>&lt;p&gt;在 Adobe 上公布了将在4月份改变 FLash Player 9 的安全策略。（&lt;a href="http://www.adobe.com/devnet/flashplayer/articles/flash_player9_security_update.html"&gt;Preparing for the Flash Player 9 April 2008 Security Update&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;这次的改变纯粹是为了安全，没有增加任何的新特性。但是默认的策略发生了一些改变，有可能会导致现有的一些程序无法正确地工作。&lt;/p&gt;
&lt;h3&gt;javascript 协议的改变&lt;/h3&gt;
&lt;p&gt;在以前，&lt;code&gt;loadMovie()&lt;/code&gt; 里可以使用 &lt;code&gt;javascript：...&lt;/code&gt; 的形式，但新的版本里只在 &lt;code&gt;getURL()&lt;/code&gt;、&lt;code&gt;navigateToURL()&lt;/code&gt; 和 &lt;code&gt;ExternalInterface&lt;/code&gt; 里支持 JavaScript。&lt;/p&gt;
&lt;h3&gt;allowScriptAcces的变化&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;allowScriptAccess&lt;/code&gt; 是指定从 swf 访问 HTML 里的 Script 的方式的属性。以前的 Flash player 对于版本7以下的 swf 的 &lt;code&gt;allowScriptAccess&lt;/code&gt; 属性的默认值为 &lt;code&gt;always&lt;/code&gt;，版本8以上的默认值为 &lt;code&gt;sameDomain&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;但新的版本对所有的版本的 swf 的默认值都将变为 &lt;code&gt;sameDomain&lt;/code&gt;。版本7以下的 swf 必须明确地指定 &lt;code&gt;allowScriptAccess = always&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;传送 HTTP Header 时的变化&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;XML.addRequestHeader()&lt;/code&gt;、&lt;code&gt;LoadVars.addRequestHeader()&lt;/code&gt;、&lt;code&gt;URLRequest.requestHeaders&lt;/code&gt; 可以添加 HTTP 请求的 Header。在新的版本里向非同域名的服务器发送请求并添加 Header 时先必须要取得服务器的的许可。&lt;/p&gt;
&lt;p&gt;具体的是需要在服务器上的 &lt;code&gt;crossdomain.xml&lt;/code&gt; 添加添加以下项目：&lt;/p&gt;
&lt;pre&gt;&amp;lt;allow-http-request-headers-from domain=&amp;quot;www.example.com&amp;quot; headers=&amp;quot;HeaderName"/&amp;gt;&lt;/pre&gt;
&lt;h3&gt;Socket 连接服务器时必须使用安全策略文件&lt;/h3&gt;
&lt;p&gt;XMLSocket 与 Socket 连接服务器的安全策略将会更严。新的版本在连接同域名时也需要使用安全策略文件，并且请求安全策略文件的端口固定为843。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3] ActionScript 3 的代码规范</title><link>http://syncspace.blogspot.com/2008/03/as3-actionscript-3.html</link><category>actionscript</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sun, 16 Mar 2008 18:57:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-7298190753096691242</guid><description>&lt;p&gt;Adobe 推出了AS3 的代码的书写规范。详情参见：&lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions"&gt;Coding Conventions&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;它推出的代码规范并不意味着开发者必须严格地遵行，仅仅是建议罢了&lt;span class="ps"&gt;(开发 Flex SDK 的除外)&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;以下为我推荐的一些内容：&lt;/p&gt;
&lt;h3&gt;数组的声明格式&lt;/h3&gt;
&lt;pre&gt;var a:Array /* of String */ = [];
var a:Array /* of int */ = [ 1, 2, 3 ];
function f(a:Array /* of Number */):Array /* of Object */  {
  //...
}&lt;/pre&gt;
&lt;p&gt;不要写成&lt;/p&gt;
&lt;pre&gt;var a:Array = [];
var a:Array = new Array();
var a:Array = new Array(1， 2， 3);
function f(a:Array):Array {
  //...
|&lt;/pre&gt;
&lt;h3&gt;Object 的声明格式&lt;/h3&gt;
&lt;pre&gt;var o:Object = {};
var o:Object = { a: 1, b: 2, c: 3 };&lt;/pre&gt;
&lt;p&gt;不要写成&lt;/p&gt;
&lt;pre&gt;var o:Object = new Object();
var o:Object = new Object();
o.a = 1;
o.b = 2;
o.c = 3&lt;/pre&gt;
&lt;h3&gt;比较&lt;/h3&gt;
&lt;pre&gt;if (n == 3) // &amp;quot;如果 n 是 3&amp;quot;&lt;/pre&gt;
&lt;p&gt;不要写成&lt;/p&gt;
&lt;pre&gt;if (3 == n) // &amp;quot;如果 3 是 n&amp;quot;&lt;/pre&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>永远的 SoundComplete 事件</title><link>http://syncspace.blogspot.com/2008/02/soundcomplate.html</link><category>flash player</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sun, 17 Feb 2008 22:36:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-5607656724919935353</guid><description>&lt;p&gt;这已经不是什么新闻了，只是关注度好像不是很高，但我认为很有必要说几句。&lt;/p&gt;
&lt;p&gt;自从 Flash Player 升级为 9.0.115.0 后 &lt;code&gt;Sound.soundComplete&lt;/code&gt; 事件就&lt;span class="ps"&gt;消失了&lt;/span&gt;！没有任何征兆，一夜之间就从这个世界消失得无影无踪。&lt;/p&gt;
&lt;p&gt;不要小看这个事件，没有它音频控制几乎不可能。比如以前一直使用 &lt;code&gt;Sound.soundComplete&lt;/code&gt; 事件来实现音频的连续回放等各种特效，现在一切变为了南柯一梦。特别是 &lt;a href="http://code.google.com/p/popforge/"&gt;popforge&lt;/a&gt; 项目，一个 使用 AS3 来创作与修改音频的先端开发的新兴项目成为了最大的受害者之一，它有可能因此而从此玉损了！&lt;/p&gt;
&lt;p&gt;大家署名来抗议吧&lt;a href="The silent death of onSoundComplete event - a petition"&gt;The silent death of onSoundComplete event - a petition&lt;/a&gt;。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>祝大家新春快乐</title><link>http://syncspace.blogspot.com/2008/02/blog-post.html</link><category>Blogger</category><author>noreply@blogger.com (Stephen)</author><pubDate>Thu, 7 Feb 2008 20:57:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-5602410733594830448</guid><description>&lt;p&gt;今天是初一，祝大家鼠年快快乐乐。也祝我的网站日月兴隆。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]让构造函数不执行 super()</title><link>http://syncspace.blogspot.com/2008/02/as3-super.html</link><category>actionscript</category><author>noreply@blogger.com (Stephen)</author><pubDate>Thu, 7 Feb 2008 00:56:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-3461479527257125787</guid><description>&lt;p&gt;在构造函数里一般 &lt;code&gt;super()&lt;/code&gt; 必须执行。如果不写，在编译时会在构造函数的最上面添加 &lt;code&gt;super()&lt;/code&gt;。但有时又需要不执行。比如以下代码：&lt;/p&gt;
&lt;pre&gt;class AbstractClass {
  public function AbstractClass() {
    throw new Error(&amp;quot;Abstract class&amp;quot;);
  }
}
class SubClass extends AbstractClass {
  public function SubClass() {
    trace(&amp;quot;sub class&amp;quot;);
  }
}&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;SubClass&lt;/code&gt; 对象会因为超类弹出错误而创建失败。但如果让 &lt;code&gt;super()&lt;/code&gt; 不执行就可以了。&lt;/p&gt;
&lt;pre&gt;class SubClass extends AbstractClass {
  public function SubClass() {
    if(0) { //这里必须为返回 false 的表达式。但不能为 &amp;quot;false&amp;quot;(false 会被编译器忽视)。
      super();
    }
    trace(&amp;quot;sub class&amp;quot;);
  }
}&lt;/pre&gt;
&lt;p&gt;测试代码：&lt;/p&gt;
&lt;pre&gt;package {
  import flash.display.*;
  public class Test extends Sprite {
    public function Test() {
      new AbstractClass(); // -&amp;gt; Super CLass
      new SubClass1(); // -&amp;gt; Super CLass / Sub CLass1 start / Sub CLass1 end
      new SubClass2(); // -&amp;gt; Sub CLass2 start / Sub CLass2 end
    }
  }
}
class AbstractClass {
  public function AbstractClass() {
    trace(&amp;quot;Super CLass&amp;quot;);
  }
}
class SubClass1 {
  public function AbstractClass() {
    trace(&amp;quot;Sub CLass1 start&amp;quot;);
    super();
    trace(&amp;quot;Sub CLass1 end&amp;quot;);
  }
}
class SubClass2 {
  public function AbstractClass() {
    trace(&amp;quot;Sub CLass2 start&amp;quot;);
    if(0) {
      super();
    }
    trace(&amp;quot;Sub CLass2 end&amp;quot;);
  }
}
&lt;/pre&gt;
&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[Flex]把 Sprite 添加到 Canvas 里的方</title><link>http://syncspace.blogspot.com/2008/02/flex-sprite-canvas.html</link><category>flex</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sun, 3 Feb 2008 18:31:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-3066296793438800477</guid><description>&lt;p&gt;&lt;strong&gt;Flex Framework&lt;/strong&gt; 的 &lt;code&gt;Canvas&lt;/code&gt; 是无法添加 &lt;code&gt;Sprite&lt;/code&gt; 等非 UI 组件的 &lt;code&gt;DisplayObject&lt;/code&gt;的。但有变通的办法。&lt;/p&gt;
&lt;h3&gt;1.使用 Adaptor 模式&lt;/h3&gt;
&lt;p&gt;把 &lt;code&gt;Sprite&lt;/code&gt; 添加到 &lt;code&gt;UIComponent&lt;/code&gt;，再把 &lt;code&gt;UIComponent&lt;/code&gt; 添加到 &lt;code&gt;Canvas&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;代码：&lt;/p&gt;
&lt;pre&gt;var mySprite:Sprite = new Sprite();&lt;br /&gt;mySprite.graphics.beginFill(0xFFCC00);&lt;br /&gt;mySprite.graphics.drawCircle( 40, 40, 40 );&lt;br /&gt;var UIRef:UIComponent = new UIComponent();&lt;br /&gt;myUI.addChild(UIRef);&lt;br /&gt;UIRef.addChild(mySprite);&lt;/pre&gt;
&lt;h3&gt;2.使用 &lt;code&gt;rawChildren&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;Canvas.rawChildren&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;代码：&lt;/p&gt;
&lt;pre&gt;var mySprite:Sprite = new Sprite();&lt;br /&gt;mySprite.graphics.beginFill(0xFFCC00);&lt;br /&gt;mySprite.graphics.drawCircle( 40, 40, 40 );&lt;br /&gt;myUI.rawChildren.addChild(mySprite);&lt;/pre&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ActionScript Snippets 加入了 RXNA</title><link>http://syncspace.blogspot.com/2008/01/actionscript-snippets-rxna.html</link><category>Blogger</category><author>noreply@blogger.com (Stephen)</author><pubDate>Wed, 30 Jan 2008 21:56:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-6119599376630308205</guid><description>&lt;p&gt;我的专门收集代码的博客 &lt;a href="http://assnippets.blogspot.com/"&gt;ActionScript Snippets&lt;/a&gt; 加入 &lt;a href="http://weblogs.macromedia.com/mxna"&gt;MXNA&lt;/a&gt; 了。&lt;/p&gt;&lt;p&gt;大家可以常去看看。
&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>POP3 协议很危险!</title><link>http://syncspace.blogspot.com/2008/01/pop3.html</link><category>网络安全</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sat, 26 Jan 2008 22:22:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-6484538300999757224</guid><description>&lt;p&gt;&lt;strong class="ps"&gt;大家注意，POP3 协议(非 POP3s)十分危险！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果使用未加密的 POP3 协议来收邮件，你的用户名与密码就用可能&lt;span class="ps"&gt;被盗&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;以下是我使用 Wireshark 接下的包：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5GsxhEAqTUahaVwx0iJ44SpE6HtNp6YZWrJfH6eivn_D9o3GsReme3fYvnh87R_xyICiX5kla8-vx6tARo0iM0t-qb74bnjvLCmVYW_J95fMNs1QkJWWD4ecprH63LYvhIm5V9_pHG-jJ/s1600/pop3Danger_rc.png" alt="" width="679" height="176" /&gt;&lt;/p&gt;
&lt;p&gt;可以看到，用户名与密码写得一清二楚。即使一个刚入门的骇客也知道该怎么解读。&lt;/p&gt;
&lt;h3&gt;解决办法：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;可以使用安全的 POP3s 协议。POP3s 协议相当于加了密的 POP3，这样用户名与密码就难以解读了。但并不是所有的邮件提供商都支持 POP3s 协议。&lt;/li&gt;
&lt;li&gt;经常换密码，这样即使被盗，也是暂时的，把损失降到最小。&lt;/li&gt;
&lt;li&gt;避免用邮件发送重要的信息。&lt;/li&gt;
&lt;/ul&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5GsxhEAqTUahaVwx0iJ44SpE6HtNp6YZWrJfH6eivn_D9o3GsReme3fYvnh87R_xyICiX5kla8-vx6tARo0iM0t-qb74bnjvLCmVYW_J95fMNs1QkJWWD4ecprH63LYvhIm5V9_pHG-jJ/s72-c/pop3Danger_rc.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]小心使用连续赋值</title><link>http://syncspace.blogspot.com/2008/01/as3.html</link><category>actionscript</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sun, 20 Jan 2008 22:27:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-3139234764686845952</guid><description>&lt;p&gt;连续赋值即为 &lt;code&gt;a = b = 1&lt;/code&gt; 的形式的赋值。这样写有时候会很方便，但有一个陷阱！&lt;/p&gt;&lt;p&gt;比如以下代码：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;var a:Array, b:String;
a = b = null;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;会报类型错误。因为在内部是编译成以下形式的。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;var a:Array;
var b:String;
b = null;
a = b;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;理所当然会报错了。以后可要注意。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]for 循环数组的效率测试</title><link>http://syncspace.blogspot.com/2008/01/as3for.html</link><category>actionscript</category><author>noreply@blogger.com (Stephen)</author><pubDate>Mon, 14 Jan 2008 16:17:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-6729200267514986089</guid><description>&lt;p&gt;循环 &lt;code&gt;(&amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;).split(&amp;quot;&amp;quot;)&lt;/code&gt; 这个数组 &lt;code&gt;100000&lt;/code&gt; 次的结果：&lt;span class="ps"&gt;(单位：ms)&lt;/span&gt;&lt;/p&gt;&lt;table width="80%" border="1"&gt;&lt;tr&gt;&lt;th scope="col"&gt;No.&lt;/th&gt;&lt;th scope="col"&gt;for 循环&lt;/th&gt;&lt;th scope="col"&gt;for..in 循环&lt;/th&gt;&lt;th scope="col"&gt;for each 循环&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;1&lt;/th&gt;&lt;td&gt;&lt;div align="right"&gt;17&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;8213&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;2165&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;2&lt;/th&gt;&lt;td&gt;&lt;div align="right"&gt;19&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;8126&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;2188&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;3&lt;/th&gt;&lt;td&gt;&lt;div align="right"&gt;18&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;8338&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;2128&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;4&lt;/th&gt;&lt;td&gt;&lt;div align="right"&gt;18&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;7100&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;2409&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;5&lt;/th&gt;&lt;td&gt;&lt;div align="right"&gt;17&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;8054&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;2945&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;平均 &lt;/th&gt;&lt;td&gt;&lt;div align="right"&gt;17.8&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;7900.2&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;2367.0&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;偏差(越小越稳定)&lt;/th&gt;&lt;td&gt;&lt;div align="right"&gt;0.748&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;443.326&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div align="right"&gt;305.225&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;测试程序：&lt;/p&gt;&lt;p&gt;&lt;script type="text/javascript"&gt;AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','520','height','490','src','http://weihe924stephen.googlepages.com/08.01forstresstest','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','http://weihe924stephen.googlepages.com/08.01forstresstest' );&lt;/script&gt;&lt;noscript&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="520" height="490"&gt;&lt;param name="movie" value="http://weihe924stephen.googlepages.com/08.01forstresstest.swf" /&gt;&lt;param name="quality" value="high" /&gt;&lt;embed src="http://weihe924stephen.googlepages.com/08.01forstresstest.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="520" height="490"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/noscript&gt;&lt;/p&gt;&lt;p&gt;源码：&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;mx:Application xmlns:mx=&amp;quot;http://www.adobe.com/2006/mxml&amp;quot; layout=&amp;quot;vertical&amp;quot;
 scriptTimeLimit=&amp;quot;10&amp;quot;
 width=&amp;quot;520&amp;quot; height=&amp;quot;490&amp;quot;&amp;gt;
 &amp;lt;mx:Script&amp;gt;
 &amp;lt;![CDATA[
 
 private static const FOR:String = &amp;quot;for 循环&amp;quot;;
 private static const FOR_IN:String = &amp;quot;for..in 循环&amp;quot;;
 private static const FOR_EACH:String = &amp;quot;for each 循环&amp;quot;
 private static var LOOP_SRC:Array = (&amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;).split(&amp;quot;&amp;quot;);
 
 private function test(testCase:String):void {
  var loopCount:int = int(count_ns.value);
  var start:int, now:int;
  var i:int;
  output(&amp;quot;@&amp;quot; + testCase);
  try {
   switch (testCase) {
    case FOR:
     start = getTimer();
     for (i = 0; i &amp;lt; loopCount; i++) {
      //var length:int = LOOP_SRC.length;
      for(var j:int; j&amp;lt;LOOP_SRC.length; j++) {
       LOOP_SRC[j].toUpperCase();
      }
     }
     now = getTimer();
     break;
    case FOR_IN:
     start = getTimer();
     for (i = 0; i &amp;lt; loopCount; i++) {
      for(var j2:String in LOOP_SRC) {
       LOOP_SRC[j2].toUpperCase();
      }
     }
     now = getTimer();
     break;
    case FOR_EACH:
     start = getTimer();
     for (i = 0; i &amp;lt; loopCount; i++) {
      for each(var v:String in LOOP_SRC) {
       v.toUpperCase();
      }
     }
     now = getTimer();
     break;
   }
  }
  catch (e:Error) {
   now = getTimer();
   output(&amp;quot;  &amp;quot; + i + &amp;quot;次时弹出错误: &amp;quot; + e);
  }
  var time:int = now - start;
  output(&amp;quot;  经过时间(ms): &amp;quot; + nf.format(time));
  output(&amp;quot;  1秒中的循环次数: &amp;quot; + nf.format(i * 1000 / time));
  output(&amp;quot;----------------------------------------&amp;quot;);
 }

 private function output(msg:String):void {
  output_ta.text += msg + &amp;quot;\n&amp;quot;;
 }
 ]]&amp;gt;
 &amp;lt;/mx:Script&amp;gt;
 
 &amp;lt;mx:NumberFormatter id=&amp;quot;nf&amp;quot; precision=&amp;quot;0&amp;quot; /&amp;gt;
 &amp;lt;mx:Panel title=&amp;quot;循环数组的压力测试&amp;quot;
  paddingTop=&amp;quot;8&amp;quot; paddingRight=&amp;quot;8&amp;quot; paddingBottom=&amp;quot;8&amp;quot; paddingLeft=&amp;quot;8&amp;quot;&amp;gt;
  &amp;lt;mx:HBox&amp;gt;
   &amp;lt;mx:Label text=&amp;quot;循环回数:&amp;quot; /&amp;gt;
   &amp;lt;mx:NumericStepper id=&amp;quot;count_ns&amp;quot; value=&amp;quot;100000&amp;quot; maximum=&amp;quot;10000000&amp;quot; /&amp;gt;
  &amp;lt;/mx:HBox&amp;gt;
  &amp;lt;mx:HBox&amp;gt;
   &amp;lt;mx:Button label=&amp;quot;{FOR}&amp;quot; click=&amp;quot;test(FOR)&amp;quot; /&amp;gt;
   &amp;lt;mx:Button label=&amp;quot;{FOR_IN}&amp;quot; click=&amp;quot;test(FOR_IN)&amp;quot; /&amp;gt;
   &amp;lt;mx:Button label=&amp;quot;{FOR_EACH}&amp;quot; click=&amp;quot;test(FOR_EACH)&amp;quot; /&amp;gt;
  &amp;lt;/mx:HBox&amp;gt;
  &amp;lt;mx:TextArea id=&amp;quot;output_ta&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;300&amp;quot; /&amp;gt;
  &amp;lt;mx:Label color=&amp;quot;red&amp;quot; text=&amp;quot;*Application.scriptTimeLimit设为了10秒。&amp;quot; /&amp;gt;
 &amp;lt;/mx:Panel&amp;gt;
&amp;lt;/mx:Application&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]trace() 与 logging 的压力测试</title><link>http://syncspace.blogspot.com/2008/01/as3trace-logging.html</link><category>actionscript</category><category>Logger</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sun, 13 Jan 2008 00:05:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-7941330318351065138</guid><description>&lt;p&gt;&lt;code&gt;trace()&lt;/code&gt; 其实很慢！以后再发布时，一定要注意去掉 &lt;code&gt;trace()&lt;/code&gt; 与 &lt;code&gt;mx.logging.Target&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;
&lt;script type="text/javascript"&gt;
AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','520','height','490','src','http://weihe924stephen.googlepages.com/08.01_trace-stress-test','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','http://weihe924stephen.googlepages.com/08.01_trace-stress-test' ); //end AC code
&lt;/script&gt;&lt;noscript&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="520" height="490"&gt;
&lt;param name="movie" value="http://weihe924stephen.googlepages.com/08.01_trace-stress-test.swf" /&gt;
&lt;param name="quality" value="high" /&gt;
&lt;embed src="http://weihe924stephen.googlepages.com/08.01_trace-stress-test.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="520" height="490"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;/noscript&gt;
&lt;/p&gt;
&lt;p&gt;源代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx=&amp;quot;http://www.adobe.com/2006/mxml&amp;quot; layout=&amp;quot;vertical&amp;quot;&lt;br /&gt; scriptTimeLimit=&amp;quot;5&amp;quot;&lt;br /&gt; width=&amp;quot;520&amp;quot; height=&amp;quot;490&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;mx:Script&amp;gt;&lt;br /&gt; &amp;lt;![CDATA[&lt;br /&gt; import mx.logging.ILogger;&lt;br /&gt; import mx.logging.Log;&lt;br /&gt; import mx.logging.targets.TraceTarget;&lt;br /&gt; &lt;br /&gt; private static const logger:ILogger = Log.getLogger(&amp;quot;TraceTest&amp;quot;);&lt;br /&gt; &lt;br /&gt; private static const NONE:String = &amp;quot;无 trace()&amp;quot;;&lt;br /&gt; private static const TRACE:String = &amp;quot;有 trace()&amp;quot;;&lt;br /&gt; private static const LOGGER:String = &amp;quot;logger.debug()&amp;quot;&lt;br /&gt; &lt;br /&gt; private var tt:TraceTarget;&lt;br /&gt; &lt;br /&gt; private function test(testCase:String):void {&lt;br /&gt;  var loopCount:int = int(count_ns.value);&lt;br /&gt;  var start:int, now:int;&lt;br /&gt;  var i:int;&lt;br /&gt;  output(&amp;quot;@&amp;quot; + testCase);&lt;br /&gt;  try {&lt;br /&gt;   switch (testCase) {&lt;br /&gt;    case NONE:&lt;br /&gt;     start = getTimer();&lt;br /&gt;     for (i = 0; i &amp;lt; loopCount; i++) {&lt;br /&gt;      &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;     }&lt;br /&gt;     now = getTimer();&lt;br /&gt;     break;&lt;br /&gt;    case TRACE:&lt;br /&gt;     start = getTimer();&lt;br /&gt;     for (i = 0; i &amp;lt; loopCount; i++) {&lt;br /&gt;      trace(&amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;);&lt;br /&gt;     }&lt;br /&gt;     now = getTimer();&lt;br /&gt;     break;&lt;br /&gt;    case LOGGER:&lt;br /&gt;     start = getTimer();&lt;br /&gt;     for (i = 0; i &amp;lt; loopCount; i++) {&lt;br /&gt;      logger.debug(&amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;);&lt;br /&gt;     }&lt;br /&gt;     now = getTimer();&lt;br /&gt;     break;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  catch (e:Error) {&lt;br /&gt;   now = getTimer();&lt;br /&gt;   output(&amp;quot;  &amp;quot; + i + &amp;quot;次时弹出错误: &amp;quot; + e);&lt;br /&gt;  }&lt;br /&gt;  var time:int = now - start;&lt;br /&gt;  output(&amp;quot;  经过时间(ms): &amp;quot; + nf.format(time));&lt;br /&gt;  output(&amp;quot;  1秒中的循环次数: &amp;quot; + nf.format(i * 1000 / time));&lt;br /&gt;  output(&amp;quot;----------------------------------------&amp;quot;);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private function updateTraceTarget():void {&lt;br /&gt;  if (!tt) {&lt;br /&gt;   tt = new TraceTarget();&lt;br /&gt;   tt.includeDate = false;&lt;br /&gt;   tt.includeTime = false;&lt;br /&gt;   tt.includeLevel = true;&lt;br /&gt;   tt.includeCategory = true;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  if (traceTarget_ch.selected) {&lt;br /&gt;   Log.addTarget(tt);&lt;br /&gt;  } else {&lt;br /&gt;   Log.removeTarget(tt);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private function output(msg:String):void {&lt;br /&gt;  output_ta.text += msg + &amp;quot;\n&amp;quot;;&lt;br /&gt; }&lt;br /&gt; ]]&amp;gt;&lt;br /&gt; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:NumberFormatter id=&amp;quot;nf&amp;quot; precision=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt; &amp;lt;mx:Panel title=&amp;quot;trace()与logger.debug()的压力测试&amp;quot;&lt;br /&gt;  paddingTop=&amp;quot;8&amp;quot; paddingRight=&amp;quot;8&amp;quot; paddingBottom=&amp;quot;8&amp;quot; paddingLeft=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;mx:HBox&amp;gt;&lt;br /&gt;   &amp;lt;mx:Label text=&amp;quot;循环回数:&amp;quot; /&amp;gt;&lt;br /&gt;   &amp;lt;mx:NumericStepper id=&amp;quot;count_ns&amp;quot; value=&amp;quot;1000000&amp;quot; maximum=&amp;quot;10000000&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;  &amp;lt;mx:HBox&amp;gt;&lt;br /&gt;   &amp;lt;mx:Button label=&amp;quot;{NONE}&amp;quot; click=&amp;quot;test(NONE)&amp;quot; /&amp;gt;&lt;br /&gt;   &amp;lt;mx:Button label=&amp;quot;{TRACE}&amp;quot; click=&amp;quot;test(TRACE)&amp;quot; /&amp;gt;&lt;br /&gt;   &amp;lt;mx:Button label=&amp;quot;{LOGGER}&amp;quot; click=&amp;quot;test(LOGGER)&amp;quot; /&amp;gt;&lt;br /&gt;   &amp;lt;mx:CheckBox id=&amp;quot;traceTarget_ch&amp;quot; label=&amp;quot;添加TraceTarget&amp;quot; change=&amp;quot;updateTraceTarget()&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;  &amp;lt;mx:TextArea id=&amp;quot;output_ta&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;300&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;mx:Label color=&amp;quot;red&amp;quot; text=&amp;quot;*Application.scriptTimeLimit设为了5秒。&amp;quot; /&amp;gt;&lt;br /&gt; &amp;lt;/mx:Panel&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]pixelDissolve 有 Bug？</title><link>http://syncspace.blogspot.com/2008/01/as3pixeldissolve-bug.html</link><category>actionscript</category><category>Bug</category><author>noreply@blogger.com (Stephen)</author><pubDate>Mon, 7 Jan 2008 16:40:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-8449659738100132802</guid><description>&lt;p&gt;最近发现使用 &lt;code&gt;BitmapData.pixelDissolve&lt;/code&gt; 溶解像素时，无论 &lt;code&gt;randomSeed&lt;/code&gt; 和 &lt;code&gt;numOfPixels&lt;/code&gt; 参数是多少，&lt;code&gt;sourceRect&lt;/code&gt; 指定的矩形的左上角一定会被溶解！&lt;/p&gt;&lt;p&gt;比如设定为溶解 10 个像素时，左上角 + 剩下的像素中取 10 个会变化。设为溶解 0 个时，只有左上角会变化。&lt;/p&gt;&lt;p&gt;例子： 可以看到左上角很不自然。&lt;/p&gt;&lt;p&gt;&lt;script type="text/javascript"&gt;AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','256','height','256','title','pixelDissolve Bug','src','http://weihe924stephen.googlepages.com/08.1pxDissolvebug','quality','low','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','http://weihe924stephen.googlepages.com/08.1pxDissolvebug' ); //end AC code&lt;/script&gt;&lt;noscript&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="256" height="256" title="pixelDissolve Bug"&gt;&lt;param name="movie" value="http://weihe924stephen.googlepages.com/08.1pxDissolvebug.swf" /&gt;&lt;param name="quality" value="low" /&gt;&lt;embed src="http://weihe924stephen.googlepages.com/08.1pxDissolvebug.swf" quality="low" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="256" height="256"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/noscript&gt;&lt;/p&gt;&lt;p&gt;例子的代码：&lt;/p&gt;&lt;pre&gt;&lt;code&gt;package {&lt;br /&gt; import flash.display.*;&lt;br /&gt; import flash.events.Event;&lt;br /&gt; import flash.geom.*;&lt;br /&gt; &lt;br /&gt; [SWF(width=&amp;quot;32&amp;quot;,height=&amp;quot;32&amp;quot;)]&lt;br /&gt; public class Test2 extends Sprite{&lt;br /&gt;  public function Test2():void {&lt;br /&gt;   var bitmap:BitmapData = new BitmapData(32, 32, false,0);&lt;br /&gt;   var seed:int = 0;&lt;br /&gt;   addChild(new Bitmap(bitmap));&lt;br /&gt;   addEventListener(Event.ENTER_FRAME, &lt;br /&gt;    function (event:Event):void {&lt;br /&gt;     seed = bitmap.pixelDissolve(bitmap, bitmap.rect, new Point(0,0), &lt;br /&gt;      seed, 5, Math.random()*0x1000000);&lt;br /&gt;    }&lt;br /&gt;   );&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;p class="ps"&gt;我用的 Flash Player 的版本是 9.0.115.0。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AS3]加载大于 2880px 的图片的方法</title><link>http://syncspace.blogspot.com/2008/01/as30-2880px.html</link><category>actionscript</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sun, 6 Jan 2008 22:35:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-2654473989421470336</guid><description>&lt;p&gt;Flash Player 在加载大于 2880px 的图片时，&lt;span class="ps"&gt;大于 2880px 的区域将会被剪掉&lt;/span&gt;！2880px 这个限度虽然一般不小，但对某些开发来说，却是一堵又高又大的墙。&lt;/p&gt;&lt;p&gt;但在 AS3.0 里，却是可以办到的！&lt;strong&gt;使用 &lt;code&gt;URLStream&lt;/code&gt; 加载后，用 &lt;code&gt;Loader.loadBytes&lt;/code&gt; 来显示&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;通过二进制的加载，会忽视外部域名的图片的安全沙箱。也就是说可以随便 &lt;code&gt;draw&lt;/code&gt; 了。但注意加载本身是需要 crossdomain.xm了的。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>ActionScript Snippets 开通了</title><link>http://syncspace.blogspot.com/2008/01/actionscript-snippets.html</link><category>Blogger</category><author>noreply@blogger.com (Stephen)</author><pubDate>Fri, 4 Jan 2008 20:53:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-9011136947450674278</guid><description>&lt;p&gt;ActionScript Snippets 是一个收集 &lt;a href="http://code.google.com/p/advancedflex/"&gt;Advanced Flex Project&lt;/a&gt; 在开发时有用的代码、类的博客。&lt;/p&gt;&lt;p&gt;代码均遵循 &lt;a href="http://www.apache.org/licenses/LICENSE-2.0.html"&gt;Apache License 2.0&lt;/a&gt;。希望对大家有所帮助。&lt;/p&gt;&lt;p&gt;地址：&lt;a href="http://assnippets.blogspot.com/"&gt;ActionScript Snippets&lt;/a&gt;。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>解决 Firefox 播放 Flash 时无法移动 Tab 的问题</title><link>http://syncspace.blogspot.com/2008/01/firefox-flash-tab.html</link><category>Firefox</category><author>noreply@blogger.com (Stephen)</author><pubDate>Thu, 3 Jan 2008 19:54:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-5237683094332913921</guid><description>&lt;p&gt;使用 Firefox 播放重的 Flash 时有时会出现无法移动、关闭 Tab，像是没有响应了一样。这时只需要新开一个标签，就恢复响应了。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>2007年，我 blog 的一年总结</title><link>http://syncspace.blogspot.com/2007/12/2007-blog.html</link><category>Blogger</category><author>noreply@blogger.com (Stephen)</author><pubDate>Mon, 31 Dec 2007 21:04:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-3195074218314351406</guid><description>&lt;p&gt;&lt;span style="font:16px;font-weight:bold"&gt;谢谢大家对我 Blog 的关注。&lt;/span&gt;我的 Blog 自从 2007-3-24 开通以来，今年共写了 116 篇文章(包含本篇)，&lt;span class="ps"&gt;总共4655人访问&lt;/span&gt;。&lt;/p&gt;
&lt;h3&gt;访问内容排行榜&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://syncspace.blogspot.com"&gt;主页&lt;/a&gt; —— 1121人访问&lt;/li&gt;
&lt;li&gt;&lt;a href="http://syncspace.blogspot.com/2007/08/fedora-7linux.html"&gt;Fedora 7(Linux)之旅&lt;/a&gt; —— 150人访问&lt;/li&gt;
&lt;li&gt;&lt;a href="http://syncspace.blogspot.com/2007/05/flex2-tag-for-jsp.html"&gt;Flex2 Tag for JSP&lt;/a&gt; —— 118人访问&lt;/li&gt;
&lt;li&gt;&lt;a href="http://syncspace.blogspot.com/2007/10/as32-gamma-correction.html"&gt;[AS3]位图的色阶控制(2) -- 伽玛校正(Gamma Correction)&lt;/a&gt; —— 101人访问&lt;/li&gt;
&lt;li&gt;&lt;a href="http://syncspace.blogspot.com/2007/03/flash-cs3-flash-8-as30-cs3-ui.html"&gt;Flash CS3 = Flash 8 + AS3.0 + CS3 UI ?&lt;/a&gt; —— 92人访问&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;文章内容排行榜&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://syncspace.blogspot.com/search/label/actionscript" title="27 Posts in actionscript"&gt;ActionScript&lt;/a&gt; 类 —— 27篇&lt;/li&gt;
&lt;li&gt;&lt;a href="http://syncspace.blogspot.com/search/label/AIR" title="16 Posts in AIR"&gt;AIR&lt;/a&gt; 类 —— 16篇&lt;/li&gt;
&lt;li&gt;&lt;a href="http://syncspace.blogspot.com/search/label/flash" title="11 Posts in flash"&gt;flash&lt;/a&gt; 类 —— 11篇&lt;/li&gt;
&lt;li&gt;&lt;a href="http://syncspace.blogspot.com/search/label/flex" title="10 Posts in flex"&gt;flex&lt;/a&gt; 类 —— 10篇&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;历史回顾&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;03-24 ： 博客诞生了，发表了第一篇文章。 —— &lt;a href="http://syncspace.blogspot.com/2007/03/osflex-project.html"&gt;osflex project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;03-28 ： 加入 Google Analytics 进行访问统计。&lt;/li&gt;
&lt;li&gt;04-29 ： Google PR 上升为 2。 —— &lt;a href="http://syncspace.blogspot.com/2007/04/bloggooglepr2.html"&gt;我的Blog这次GooglePR升为2了！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;05-04 ： 加入了 MXNA。 —— &lt;a href="http://syncspace.blogspot.com/2007/05/mxnae-mail.html"&gt;我收到了MXNA的E-mail了&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;05-28 ： 把 Feed 移到 FeedBurner。&lt;/li&gt;
&lt;li&gt;06-04 ： 当天访问量超过50。&lt;/li&gt;
&lt;li&gt;06-05 ： 加入了 RXNA。 —— &lt;a href="http://syncspace.blogspot.com/2007/06/rxna.html"&gt;加入RXNA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;07-01 ： Blog 改版第一期工程完毕。风格改为了 Ocean blue。 —— &lt;a href="http://syncspace.blogspot.com/2007/07/blog.html"&gt;Blog改版基本完毕！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;07-29 ： 加入了 technorati。&lt;/li&gt;
&lt;li&gt;10-24 ： 在 Box.net 上申请了一个附件空间 —— &lt;a href="http://syncspace.blogspot.com/2007/10/blog-post.html"&gt;我的附件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;10-27 ： Google PR 上升为 6。 —— &lt;a href="http://syncspace.blogspot.com/2007/10/bloggooglepr6.html"&gt;奇迹！我的Blog的GooglePR上升为6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;11-03 ： Blog 改版第二期工程完毕。添加了相关链接、标签云等并做了 一些 SEO。 —— &lt;a href="http://syncspace.blogspot.com/2007/11/blog.html"&gt;Blog改版二期工程基本完毕！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>MXNA最近很怪</title><link>http://syncspace.blogspot.com/2007/12/mxna.html</link><category>MXNA</category><author>noreply@blogger.com (Stephen)</author><pubDate>Sat, 29 Dec 2007 18:15:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-3785111172462654004</guid><description>&lt;p&gt;最近，&lt;a href="http://weblogs.macromedia.com/mxna/"&gt;MXNA &lt;/a&gt;上有很多垃圾信息。&lt;/p&gt;&lt;p&gt;今天中午去查看 Google Reader 时，发现从昨天晚上到今天中午，MXNA 的中文内容有102条。其中"自由鸟的BLOG"与"windflower"占了大多数。其中包含了大量的广告信息。&lt;/p&gt;&lt;p&gt;我一气之下把 MXNA 的中文内容退订了！&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>[AI]高级人工智能(2)——结合队伍</title><link>http://syncspace.blogspot.com/2007/12/ai2.html</link><category>AI</category><author>noreply@blogger.com (Stephen)</author><pubDate>Wed, 26 Dec 2007 23:58:00 +0900</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7120677425228950723.post-8294446579662333549</guid><description>&lt;p&gt;续 &lt;a href="http://syncspace.blogspot.com/2007/12/ai1.html"&gt;[AI]高级人工智能(1)——回避障碍物&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;结合队伍就是诱导各个人到周围的人的平均位置。这是队伍一起行动的三大步骤之一。通过结合，各个人就会聚合到一起，出现队伍。&lt;/p&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;p&gt;
&lt;script type="text/javascript"&gt;
AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','400','height','400','title','结合队伍','src','http://weihe924stephen.googlepages.com/2007.12AI_Cohesion','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','movie','http://weihe924stephen.googlepages.com/2007.12AI_Cohesion' ); //end AC code
&lt;/script&gt;&lt;noscript&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="400" height="400" title="结合队伍"&gt;
 &lt;param name="movie" value="http://weihe924stephen.googlepages.com/2007.12AI_Cohesion.swf" /&gt;
 &lt;param name="quality" value="high" /&gt;
 &lt;embed src="http://weihe924stephen.googlepages.com/2007.12AI_Cohesion.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="400" height="400"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;/noscript&gt;
&lt;/p&gt;
&lt;p&gt;人刚开始是随机移动，但遇到其他的人时，就会跟随他。但碰到障碍物等时有可能无法跟上，而又开始随机移动。当一群(boids)遇到另外一群时有可能结合在一起，也有可能队员发生互换后分开。&lt;/p&gt;
&lt;h3&gt;得到周围的人&lt;/h3&gt;
&lt;p&gt;每一个人有一个视野距离与视野范围。比如某个机器人可以看到 100m ，眼睛的夹角在120度 以内的物体。其中&amp;quot;100m&amp;quot;为视野距离(以下称为 &lt;code&gt;r&lt;/code&gt;)，&amp;quot;120度&amp;quot;为视野范围(以下称为 &lt;code&gt;th&lt;/code&gt;)。&lt;/p&gt;
&lt;p&gt;核心代码：&lt;/p&gt;
&lt;pre&gt;//周围的人列表。&lt;br /&gt;internal var aroundList:Array;&lt;br /&gt;&lt;br /&gt;//可视列表。&lt;br /&gt;internal var inViewList:Array;

//创建可视列表。&lt;br /&gt;public function resetViewList():void {&lt;br /&gt;  inViewList = [];&lt;br /&gt;  aroundList = [];&lt;br /&gt;  for each(var u:C2Unit in onwer.unitsList) {&lt;br /&gt;    if(!u.following &amp;amp;&amp;amp; u != this) {&lt;br /&gt;      if(inAround(u)) {&lt;br /&gt;        aroundList.push(u);&lt;br /&gt;        if(inView(u)) {&lt;br /&gt;          inViewList.push(u);&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}

//判断是否在周围。&lt;br /&gt;public function inAround(u:C2Unit):Boolean {&lt;br /&gt;  if(Vector2d.distance(pos, u.pos) &amp;gt; VIEW_DISTANCE) {//VIEW_DISTANCE 为 r&lt;br /&gt;    return false;&lt;br /&gt;  }&lt;br /&gt;  return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//判断是否在视野范围内。&lt;br /&gt;public function inView(u:C2Unit):Boolean {&lt;br /&gt;  var dsu:Vector2d = new Vector2d().sub(u.pos, pos);//dsu = u - pos (pos为自己的坐标)&lt;br /&gt;  if(dsu.angle2(pos)&amp;gt;VIEW_WIDTH) {//VIEW_WIDTH 为 th/2&lt;br /&gt;    return false;&lt;br /&gt;  }&lt;br /&gt;  return true;&lt;br /&gt;}&lt;/pre&gt;
  &lt;h3&gt;结合&lt;/h3&gt;
  &lt;p&gt;实现结合，其实很简单，就是把速度(方向和长度)设为周围的人的平均速度即可。&lt;/p&gt;
  &lt;p&gt;核心代码：&lt;/p&gt;
  &lt;pre&gt;//结合。&lt;br /&gt;internal function follow():void {&lt;br /&gt;  if(inViewList.length) {&lt;br /&gt;    var avg:Vector2d = new Vector2d();&lt;br /&gt;    for each(var u:C2Unit in inViewList) {&lt;br /&gt;      avg.addTo(u.v);&lt;br /&gt;    }&lt;br /&gt;    avg.scaleTo(1/inViewList.length);&lt;br /&gt;    v.reset(avg);&lt;br /&gt;    following = true;&lt;br /&gt;  }else{&lt;br /&gt;    following = false;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;
  &lt;p&gt;完整源码下载：&lt;a href="http://www.box.net/shared/yyj68kdcg0"&gt;结合队伍.rar&lt;/a&gt;，或访问&lt;a href="http://syncspace.blogspot.com/2007/10/blog-post.html"&gt;我的附件&lt;/a&gt;。&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item></channel></rss>