加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

BitmapData.draw比BitmapData.copyPixel能做得更多

发布时间:2020-12-15 17:25:52 所属栏目:百科 来源:网络整理
导读:BitmapData.draw 比 BitmapData.copyPixel 能做得更多 ? Flash 一直让人诟病的就是它的渲染效率,同屏的对象达到了一定程度后帧数就哗哗的降,不过幸好我们有 BitmapData ,很原始的位图操作, API 没有 DisplayObject 那么好用,但效率却有很大的改善,这也

BitmapData.drawBitmapData.copyPixel能做得更多

?

Flash一直让人诟病的就是它的渲染效率,同屏的对象达到了一定程度后帧数就哗哗的降,不过幸好我们有BitmapData,很原始的位图操作,API没有DisplayObject那么好用,但效率却有很大的改善,这也是Flash社区讨论得很多的一个话题。

?

纯位图渲染比Flash自家的可视对象体系会快,但带来的问题是难用,鼠标的交互也需要重新实现,网上有一些开源的位图引擎:

1)fixelhttp://flixel.org/

2)FlashPunkhttp://flashpunk.net/

更多请参考:http://zengrong.net/flashassistant?

?

引擎的实现不是这里要讲的话题,我想讲的是BitmapData.drawBitmapData.copyPixel这两上方法的区别。

关于BitmapDatahttp://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html?

?

copyPixel:像素拷贝,从源位图上选取一个矩形区域,拷贝到目标位图的指定点位置。

参数详解:

sourceBitmapData:BitmapData?—?要从中复制像素的输入位图图像。源图像可以是另一个?BitmapData?实例,也可以指当前?BitmapData?实例。

sourceRect:Rectangle?—?定义要用作输入的源图像区域的矩形。?

destPoint:Point?—?目标点,它表示将在其中放置新像素的矩形区域的左上角。?

alphaBitmapData:BitmapData?(default?=?null)?—?第二个?Alpha?BitmapData?对象源。??

alphaPoint:Point?(default?=?null)?—?Alpha?BitmapData?对象源中与?sourceRect?参数的左上角对应的点。??

mergeAlpha:Boolean?(default?=?false)?—?若要使用?Alpha?通道,请将该值设置为?true。若要复制不含?Alpha?通道的像素,请将该值设置为?false。??

?

*?这里想重点说一下第456参数。第45参数一般是一起用,用来指定一个Alpha图像源中的矩形区域,这个区域左上角由alphaPoint指定,宽高则和sourceRect一样。当该区域中alpha通道为0时,则渲染后是透明的,为1时则为可见,由些,可以实现半透明乃致全透明的效果,在2D页游中可以做出比较真实的遮挡效果,看下图(左边为使用了alphaBitmapData):

?

关于第6个参数,是否使用alpha混合,看个图就明白了:

?

?

draw:绘制一个对象,该对象需要实现IBitmapDrawable接口,像DisplayObject

参数详解:

source:IBitmapDrawable?—?要绘制到?BitmapData?对象的显示对象或?BitmapData?对象。(DisplayObject?和?BitmapData?类实现?IBitmapDrawable?接口。)??

matrix:Matrix?(default?=?null)?—?一个?Matrix?对象,用于缩放、旋转位图或转换位图的坐标。如果不想将矩阵转换应用于图像,请将此参数设置为恒等矩阵(使用默认?new?Matrix()?构造函数创建),或传递?null?值。?

colorTransform:ColorTransform?(default?=?null)?—?一个?ColorTransform?对象,用于调整位图的颜色值。如果没有提供任何对象,则不会转换位图图像的颜色。如果必须传递此参数但又不想转换图像,请将此参数设置为使用默认?new?ColorTransform()?构造函数创建的?ColorTransform?对象。?

blendMode:String?(default?=?null)?—?来自?flash.display.BlendMode?类的一个字符串值,指定要应用于所生成位图的混合模式。??

clipRect:Rectangle?(default?=?null)?—?一个?Rectangle?对象,定义要绘制的源对象的区域。如果不提供此值,则不会进行剪裁,并且将绘制整个源对象。??

smoothing:Boolean?(default?=?false)?—?一个布尔值,用于确定因在?matrix?参数中指定缩放或旋转而对?BitmapData?对象进行缩放或旋转以后,是否对该对象进行平滑处理。smoothing?参数只有在?source?参数是?BitmapData?对象时才适用。在将?smoothing?设置为?false?的情况下,经过旋转或缩放的?BitmapData?图像可能会显得像素化或带有锯齿。?

?

*?里面有两个参数matrixclipRectcopyPixel中的destPointsourceRect很像,但用法却是天差地别。

copyPixel可以指定绘制的区域以及绘制到目标位图的位置,draw也可以,但却需要注意参数的用法和copyPixel是不同的。

matrix是矩阵转换,可以进行位移,旋转,缩放操作,但是但是,注意,这个操作都是对源位图进行操作,并非是目标位图上的操作,而clipRect也是指源位图上的区域。

所以matrixclipRect这两上参数的含义是:源位图经过矩形转换后,再从源位图上拷贝clipRect指定的区域,到目标位图上的clipRect区域,看清楚了,是目标位图上的clipRect区域!

经过这样理解后,我们可以把draw方法包装一下:

?

public? static? function? draw(target:BitmapData,source:IBitmapDrawable,rect:Rectangle,pt:Point,colorTransform:ColorTransform = null ,scale: Number? = 1 ): void
{
???? clipRect.x = pt.x;
clipRect.y = pt.y;
clipRect.width = rect.width * scale;
clipRect.height = rect.height * scale;
matrix.tx = pt.x - rect.x;
matrix.ty = pt.y - rect.y;
matrix.a = matrix.d = scale; //x,y分别缩放
target.draw(source,matrix,colorTransform, false );
}

  

包装后的用法就和copyPixel一样了。

而且更重要的是,draw可以缩放,可以颜色转换,可以滤镜。

?

*关于colorTransform参数,游戏中一个人物受击的时候,我们会给把人物的形象变红,colorTransform.redOffset=100,这样人物的红色通道就会更深,当人物中毒的时候,可以加深绿色通道,当人物烧焦的时候,变黑等等。

?

最后,copyPixel的效率比draw高,所以一般情况下,copyPiexl用得比较多,draw会用在比较特殊的地方,而且不会每帧都调用,选择性的调用。

当然用copyPiexl还是draw都是需要根据情况而定,参考:http://www.fans8.com/?p=512?

?


作者:Easily?
出处:http://www.cnblogs.com/yili16438/?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读