使用位图数据绘制海量图像

时间:2011-02-18 12:10:38

标签: flash actionscript-3

我正在AS3打雪橇游戏。我遇到的问题是我想在董事会后面的雪中留下痕迹。

我有一种想法和感觉,实现这一目标的最佳方法是使用lineTo()方法从滑雪板的前一个位置到当前位置绘制一条线。如果我一直沿着斜坡走这条路,我最终会得到一条长度近23000像素的线,看起来非常大,会对性能产生重大影响。

如果我将跟踪动画片段转换为位图会改善性能吗?我的目标是最小的flash player 9,我发现在处理bmp超过2880像素时遇到问题,所以我认为这种方法可能不起作用。

有人能想到干净快速的解决方案吗?

提前致谢

2 个答案:

答案 0 :(得分:3)

您可以在固定长度的Vector / Array中存储一些值,并在移动其他值时保持更新单个值(因此它们有点'过时'):

var ptsNum:int = 25;
var pts:Vector.<Point> = new Vector.<Point>(ptsNum,true);
for(var i:int = 0 ; i < ptsNum ; i++) pts[i] = new Point(mouseX,mouseY);
this.addEventListener(Event.ENTER_FRAME, update);

function update(event:Event):void{
    //update
    for(var i:int = 0 ; i < ptsNum-1 ; i++) pts[i] = pts[i+1];
    pts[ptsNum-1] = new Point(mouseX,mouseY);
    //draw
    graphics.clear();
    graphics.moveTo(pts[0].x,pts[0].y);
    for(i = 0 ; i < ptsNum ; i++){
        graphics.lineStyle(i,0,i/ptsNum);
        graphics.lineTo(pts[i].x,pts[i].y);
    }
}

我在更新中使用两个for循环只是为了从绘图中拆分更新,所以很容易理解。当然,如果您愿意,可以使用单个for循环,或者使用类似forEach()之类的东西进行轮班,直到您。

trail

如果要使用BitmapData绘制轨迹,可以将矩形(或边界的形状)重绘为BitmapData,并使用ColorMatrix进行淡入淡出:

var sw:int = stage.stageWidth,sh:int = stage.stageHeight;
var bd:BitmapData = new BitmapData(sw,sh,false,0);
var pMouse:Point = new Point();//previous mouse position
var zero:Point = new Point();
var fade:ColorMatrixFilter = new ColorMatrixFilter([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0.95,0]);//alpha 0.95
var r:Shape = new Shape();r.graphics.beginFill(0x009900,0.9);r.graphics.drawRect(-10,-15,20,30);//a tall rect
addChild(new Bitmap(bd));
addEventListener(Event.ENTER_FRAME, update);

function update(event:Event):void{
    r.x = mouseX;
    r.y = mouseY;
    r.rotation = Math.atan2(mouseY-pMouse.y,mouseX-pMouse.x) * 57.2957795;//rotate to mouse
    pMouse.x = mouseX;
    pMouse.y = mouseY;
    bd.draw(r,r.transform.matrix);//draw the rect at it's current position
    bd.applyFilter(bd, bd.rect, zero, fade);//apply the alpha colorMatrix
}

trail with alpha

HTH

答案 1 :(得分:1)

通常,移动和缩放位图应该比矢量图形更快。但是,如果您经常使用过滤器和像素修改方法(如bitmap.draw()),这将降低性能。在任何情况下,您都应该将这样的大位图分成较小的块,并将可见屏幕区域之外的所有内容设置为visible = false;