flash像素操作setPixels,setVector,copyPixels,draw性能比较

来源:互联网 发布:手机模拟电视软件 编辑:程序博客网 时间:2024/05/16 17:59

列子是转的,分析是原创的

 

var start:int = getTimer();
2for (var j:int = 0; j < 9999; j++) {
3var arr:Vector.<uint> = bmd2.getVector(new Rectangle(10, 20, 80, 80));
4bmd1.setVector(new Rectangle(10, 10, 80, 80), arr);
5}
6trace("setVector", getTimer() - start);
1var start:int = getTimer();
2for (var i:int = 0 ; i < 9999; i++) {
3var arr:ByteArray = bmd2.getPixels(new Rectangle(10, 20, 80, 80));
4arr.position = 0;
5bmd1.setPixels(new Rectangle(10, 10, 80, 80), arr);
6}
7trace("setPixels", getTimer() - start);
1var start:int = getTimer();
2for (var j:int = 0; j < 9999; j++) {
3bmd1.copyPixels(bmd2, new Rectangle(10, 20, 80, 80), new Point(10, 10));
4}
5trace("copyPixels", getTimer() - start);
1var start:int = getTimer();
2for (var j:int = 0; j < 9999; j++) {
3bmd1.draw(bmd2,new Matrix(0.8,0,0,0.8),null,null,new Rectangle(10, 10,80,80));
4}
5trace("draw", getTimer() - start);

 

经过测试,执行1W次copy,setVector是800毫秒,setPixels是3973毫秒,draw870毫秒,当然最快的还是copyPixels:130毫秒

setPixels读取的速度比较慢,写的速度大家基本相同。

copyPixels>setVector>draw>setPixels

 

 

其实上面的列子 看了我下面的解释你就会知道是有BUG的 Matrix(0.8,0,0,0.8), 表示对矩阵进行了缩放。具体时间大家可以还原

Matrix(1,0,0,1),后测试

 

//--------------------------顺便贴两个拷贝,大家好参照着转换

01.var bmd:BitmapData = new BitmapData(tf.width, tf.height); 
02.bmd.draw(tf); 
03. 
04.var tempRectangle:Rectangle = new Rectangle(50, 50, 135, 135); 
05.var tPoint:Point = new Point(0, 0);//tPoint为在myBitmapData中的位置 
06. 
07.var myBitmapData:BitmapData = new BitmapData(135, 135, false, 0x000000); 
08.myBitmapData.copyPixels(bmd, tempRectangle, tPoint);//在_MapData中拷贝tempRectangle区域像素并放在myBitmapData中的tPoint位置     
09. 
10.var bmp:Bitmap = new Bitmap(myBitmapData); 
11.addChild(bmp); // bmp 的位置是在(0, 0) 


----------------------------------------------------------------------

01.var tempRectangle:Rectangle = new Rectangle(39, 99, 135, 135); // 我想截取图片起点(39, 99),宽135,高135的区域 
02. 
03.var myBitmapData:BitmapData = new BitmapData(135, 135); // 声明宽为135高为135的bitmapdata 
04.myBitmapData.draw(tf, new Matrix(1,0,0,1,-39,-99)); //将bitmapData的注册点放在截图的起点39,99 
05.myBitmapData.draw(myBitmapData,null, null, null, tempRectangle); // 把要截取的图片区域画到bitmapdata中 
06. 
07.var bmp:Bitmap = new Bitmap(myBitmapData); 
08.this.addChild(bmp); 


Matrix 六个参数的最后两个tx, ty 就是Rectangle 的前两个参数x, y;

 

转换矩阵对象为具有如下内容的 3 x 3 的矩阵:

[  a b tx  ]

   c d ty

   u v w

 

在传统的转换矩阵中,uvw 属性具有其他功能。Matrix 类只能在二维空间中操作,因此始终假定属性值 uv 为 0.0,属性值 w 为 1.0。矩阵的有效值如下:

 

[  a b tx ]

    c d ty

    0 0 1

 

上面的 Matrix(1,0,0,1 ) 其实对应的就是

 

[  1 0 tx ]

   0 1 ty

   0 0  1            其实就是矩阵平移。 (不懂的可以参见Flex4+as3+API.chm)网上有下载的,或者翻阅大学数学