我的专门收集代码的博客 ActionScript Snippets 加入 MXNA 了。
大家可以常去看看。
Beyond the World, synchronize with the Universe.
大家注意,POP3 协议(非 POP3s)十分危险!
如果使用未加密的 POP3 协议来收邮件,你的用户名与密码就用可能被盗。
以下是我使用 Wireshark 接下的包:
可以看到,用户名与密码写得一清二楚。即使一个刚入门的骇客也知道该怎么解读。
连续赋值即为 a = b = 1
的形式的赋值。这样写有时候会很方便,但有一个陷阱!
比如以下代码:
var a:Array, b:String;
a = b = null;
会报类型错误。因为在内部是编译成以下形式的。
var a:Array;
var b:String;
b = null;
a = b;
理所当然会报错了。以后可要注意。
循环 ("abcdefghijklmnopqrstuvwxyz").split("")
这个数组 100000
次的结果:(单位:ms)
No. | for 循环 | for..in 循环 | for each 循环 |
---|---|---|---|
1 | 17 | 8213 | 2165 |
2 | 19 | 8126 | 2188 |
3 | 18 | 8338 | 2128 |
4 | 18 | 7100 | 2409 |
5 | 17 | 8054 | 2945 |
平均 | 17.8 | 7900.2 | 2367.0 |
偏差(越小越稳定) | 0.748 | 443.326 | 305.225 |
测试程序:
源码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
scriptTimeLimit="10"
width="520" height="490">
<mx:Script>
<![CDATA[
private static const FOR:String = "for 循环";
private static const FOR_IN:String = "for..in 循环";
private static const FOR_EACH:String = "for each 循环"
private static var LOOP_SRC:Array = ("abcdefghijklmnopqrstuvwxyz").split("");
private function test(testCase:String):void {
var loopCount:int = int(count_ns.value);
var start:int, now:int;
var i:int;
output("@" + testCase);
try {
switch (testCase) {
case FOR:
start = getTimer();
for (i = 0; i < loopCount; i++) {
//var length:int = LOOP_SRC.length;
for(var j:int; j<LOOP_SRC.length; j++) {
LOOP_SRC[j].toUpperCase();
}
}
now = getTimer();
break;
case FOR_IN:
start = getTimer();
for (i = 0; i < 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 < loopCount; i++) {
for each(var v:String in LOOP_SRC) {
v.toUpperCase();
}
}
now = getTimer();
break;
}
}
catch (e:Error) {
now = getTimer();
output(" " + i + "次时弹出错误: " + e);
}
var time:int = now - start;
output(" 经过时间(ms): " + nf.format(time));
output(" 1秒中的循环次数: " + nf.format(i * 1000 / time));
output("----------------------------------------");
}
private function output(msg:String):void {
output_ta.text += msg + "\n";
}
]]>
</mx:Script>
<mx:NumberFormatter id="nf" precision="0" />
<mx:Panel title="循环数组的压力测试"
paddingTop="8" paddingRight="8" paddingBottom="8" paddingLeft="8">
<mx:HBox>
<mx:Label text="循环回数:" />
<mx:NumericStepper id="count_ns" value="100000" maximum="10000000" />
</mx:HBox>
<mx:HBox>
<mx:Button label="{FOR}" click="test(FOR)" />
<mx:Button label="{FOR_IN}" click="test(FOR_IN)" />
<mx:Button label="{FOR_EACH}" click="test(FOR_EACH)" />
</mx:HBox>
<mx:TextArea id="output_ta" width="400" height="300" />
<mx:Label color="red" text="*Application.scriptTimeLimit设为了10秒。" />
</mx:Panel>
</mx:Application>
trace()
其实很慢!以后再发布时,一定要注意去掉 trace()
与 mx.logging.Target
。
源代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
scriptTimeLimit="5"
width="520" height="490">
<mx:Script>
<![CDATA[
import mx.logging.ILogger;
import mx.logging.Log;
import mx.logging.targets.TraceTarget;
private static const logger:ILogger = Log.getLogger("TraceTest");
private static const NONE:String = "无 trace()";
private static const TRACE:String = "有 trace()";
private static const LOGGER:String = "logger.debug()"
private var tt:TraceTarget;
private function test(testCase:String):void {
var loopCount:int = int(count_ns.value);
var start:int, now:int;
var i:int;
output("@" + testCase);
try {
switch (testCase) {
case NONE:
start = getTimer();
for (i = 0; i < loopCount; i++) {
"abcdefghijklmnopqrstuvwxyz";
}
now = getTimer();
break;
case TRACE:
start = getTimer();
for (i = 0; i < loopCount; i++) {
trace("abcdefghijklmnopqrstuvwxyz");
}
now = getTimer();
break;
case LOGGER:
start = getTimer();
for (i = 0; i < loopCount; i++) {
logger.debug("abcdefghijklmnopqrstuvwxyz");
}
now = getTimer();
break;
}
}
catch (e:Error) {
now = getTimer();
output(" " + i + "次时弹出错误: " + e);
}
var time:int = now - start;
output(" 经过时间(ms): " + nf.format(time));
output(" 1秒中的循环次数: " + nf.format(i * 1000 / time));
output("----------------------------------------");
}
private function updateTraceTarget():void {
if (!tt) {
tt = new TraceTarget();
tt.includeDate = false;
tt.includeTime = false;
tt.includeLevel = true;
tt.includeCategory = true;
}
if (traceTarget_ch.selected) {
Log.addTarget(tt);
} else {
Log.removeTarget(tt);
}
}
private function output(msg:String):void {
output_ta.text += msg + "\n";
}
]]>
</mx:Script>
<mx:NumberFormatter id="nf" precision="0" />
<mx:Panel title="trace()与logger.debug()的压力测试"
paddingTop="8" paddingRight="8" paddingBottom="8" paddingLeft="8">
<mx:HBox>
<mx:Label text="循环回数:" />
<mx:NumericStepper id="count_ns" value="1000000" maximum="10000000" />
</mx:HBox>
<mx:HBox>
<mx:Button label="{NONE}" click="test(NONE)" />
<mx:Button label="{TRACE}" click="test(TRACE)" />
<mx:Button label="{LOGGER}" click="test(LOGGER)" />
<mx:CheckBox id="traceTarget_ch" label="添加TraceTarget" change="updateTraceTarget()"/>
</mx:HBox>
<mx:TextArea id="output_ta" width="400" height="300" />
<mx:Label color="red" text="*Application.scriptTimeLimit设为了5秒。" />
</mx:Panel>
</mx:Application>
最近发现使用 BitmapData.pixelDissolve
溶解像素时,无论 randomSeed
和 numOfPixels
参数是多少,sourceRect
指定的矩形的左上角一定会被溶解!
比如设定为溶解 10 个像素时,左上角 + 剩下的像素中取 10 个会变化。设为溶解 0 个时,只有左上角会变化。
例子: 可以看到左上角很不自然。
例子的代码:
package {
import flash.display.*;
import flash.events.Event;
import flash.geom.*;
[SWF(width="32",height="32")]
public class Test2 extends Sprite{
public function Test2():void {
var bitmap:BitmapData = new BitmapData(32, 32, false,0);
var seed:int = 0;
addChild(new Bitmap(bitmap));
addEventListener(Event.ENTER_FRAME,
function (event:Event):void {
seed = bitmap.pixelDissolve(bitmap, bitmap.rect, new Point(0,0),
seed, 5, Math.random()*0x1000000);
}
);
}
}
}
我用的 Flash Player 的版本是 9.0.115.0。
Flash Player 在加载大于 2880px 的图片时,大于 2880px 的区域将会被剪掉!2880px 这个限度虽然一般不小,但对某些开发来说,却是一堵又高又大的墙。
但在 AS3.0 里,却是可以办到的!使用 URLStream
加载后,用 Loader.loadBytes
来显示。
通过二进制的加载,会忽视外部域名的图片的安全沙箱。也就是说可以随便 draw
了。但注意加载本身是需要 crossdomain.xm了的。
ActionScript Snippets 是一个收集 Advanced Flex Project 在开发时有用的代码、类的博客。
代码均遵循 Apache License 2.0。希望对大家有所帮助。
使用 Firefox 播放重的 Flash 时有时会出现无法移动、关闭 Tab,像是没有响应了一样。这时只需要新开一个标签,就恢复响应了。
This work is licensed under a
Creative Commons Attribution-Noncommercial-Share Alike 3.0 License.
详细请参照版本声明
欢迎使用任何 RSS 阅读器订阅本 Blog 最新文章
通过电子邮件订阅: