使用 BitmapData 类创建自定义位图缓存行为。
以下示例重用了显示对象的单一栅格化位图版本并引用了同一个 BitmapData 对象。当缩放每个显示对象时,不会更新和重绘内存中的原始 BitmapData 对象。此方法可节省 CPU 资源并加快应用程序的运行速度。缩放显示对象时,将拉伸其中包含的位图。
以下是更新后的
BitmapApple
类:
package org.bytearray.bitmap
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
public class BitmapApple extends Bitmap
{
private var destinationX:Number;
private var destinationY:Number;
public function BitmapApple(buffer:BitmapData)
{
super(buffer);
addEventListener(Event.ADDED_TO_STAGE,activation);
addEventListener(Event.REMOVED_FROM_STAGE,deactivation);
}
private function activation(e:Event):void
{
initPos();
addEventListener(Event.ENTER_FRAME,handleMovement);
}
private function deactivation(e:Event):void
{
removeEventListener(Event.ENTER_FRAME,handleMovement);
}
private function initPos():void
{
destinationX = Math.random()*(stage.stageWidth - (width>>1));
destinationY = Math.random()*(stage.stageHeight - (height>>1));
}
private function handleMovement(e:Event):void
{
alpha = Math.random();
x -= (x - destinationX)*.5;
y -= (y - destinationY)*.5;
if ( Math.abs(x - destinationX) < 1 && Math.abs(y - destinationY) < 1)
initPos();
}
}
}
仍在各个帧上修改 alpha 值。以下代码将原始源缓冲区传递给各个 BitmapApple 实例:
import org.bytearray.bitmap.BitmapApple;
const MAX_NUM:int = 100;
var holder:Sprite = new Sprite();
addChild(holder);
var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true);
var source:AppleSource = new AppleSource();
var bounds:Object = source.getBounds(source);
var mat:Matrix = new Matrix();
mat.translate(-bounds.x,-bounds.y);
var buffer:BitmapData = new BitmapData(source.width+1, source.height+1, true, 0);
buffer.draw(source,mat);
var bitmapApple:BitmapApple;
for (var i:int = 0; i< MAX_NUM; i++)
{
bitmapApple = new BitmapApple(buffer);
holderVector[i] = bitmapApple;
holder.addChild(bitmapApple);
}
此技术仅占用少量内存,因为只使用内存中单个缓存的位图并由所有
BitmapApple
实例共享。此外,不管对
BitmapApple
实例做任何修改(例如 alpha、旋转或缩放),原始源位图永远不会更新。使用此技术可防止性能降低。
要获得平滑的最终位图,请将
smoothing
属性设置为
true
:
public function BitmapApple(buffer:BitmapData)
{
super (buffer);
smoothing = true;
addEventListener(Event.ADDED_TO_STAGE, activation);
addEventListener(Event.REMOVED_FROM_STAGE, deactivation);
}
调整舞台品质也可以提高性能。将舞台品质设置为
HIGH
,进行栅格化处理,然后切换到
LOW
:
import org.bytearray.bitmap.BitmapApple;
const MAX_NUM:int = 100;
var holder:Sprite = new Sprite();
addChild ( holder );
var holderVector:Vector.<BitmapApple> = new Vector.<BitmapApple>(MAX_NUM, true);
var source:AppleSource = new AppleSource();
var bounds:Object = source.getBounds ( source );
var mat:Matrix = new Matrix();
mat.translate ( -bounds.x, -bounds.y );
var buffer:BitmapData = new BitmapData ( source.width+1, source.height+1, true, 0 );
stage.quality = StageQuality.HIGH;
buffer.draw ( source, mat );
stage.quality = StageQuality.LOW;
var bitmapApple:BitmapApple;
for (var i:int = 0; i< MAX_NUM; i++ )
{
bitmapApple = new BitmapApple( buffer );
holderVector[i] = bitmapApple;
holder.addChild ( bitmapApple );
}
在将矢量绘制为位图前后切换舞台品质是一项功能强大的技术,可以在屏幕上获得消除锯齿的内容。无论最终舞台品质如何,此技术都有效。例如,您可以通过使用消除锯齿文本,甚至通过将舞台品质设置为
LOW
来获取消除锯齿的位图。使用
cacheAsBitmap
属性时不能实现此技术。在这种情况下,将舞台品质设置为
LOW
会更新矢量品质,从而更新内存中的位图表面,并更新最终品质。