AS3从瓷砖组大量裁剪瓷砖的最佳方法?

时间:2014-03-02 17:49:45

标签: actionscript-3 actionscript bitmap crop

好的,所以我正在尝试创建一个程序,从csv文件中读取地图,然后使用tileheet绘制每个tile。在地图中阅读工作正常,我可以根据读入的值绘制某些图块,但前提是我嵌入了图像。显然,当涉及到> 20个不同的瓷砖时,这是不切实际的;嵌入它们只是不聪明。

这是我从瓷砖表中绘制瓷砖的代码。

package  
{
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;

public class Tile extends Sprite
{
    [Embed(source="../bin/lib/TileSheet.png")]
    private var BitmapClass:Class;
    private var tileBitmap:Bitmap = new BitmapClass();
    var tileSize = 25;
    var tileSheetLength = 20;
    var sheetColumns:int = tileBitmap.bitmapData.width / tileSize;
    var pt:Point = new Point(0, 0);
    var bmp:Bitmap = new Bitmap(new BitmapData(tileSize, tileSize, true, 0));

        public function Tile(collide:Boolean, id:int) 
        {
            Draw(id);
        }
        private function Draw(id:int):void
        {
            var col:int = id % sheetColumns;
            var row:int = Math.floor(id / sheetColumns);
            var rect:Rectangle = new Rectangle(col * tileSize, row * tileSize, tileSize, tileSize);
            bmp.bitmapData.copyPixels (tileBitmap.bitmapData, rect, pt, null, null, true);
            this.addChild(bmp);
        }

        public function Update():void
        {

        }
}

}
'

所以我需要帮助的是优化这段代码,这样我就可以运行它大约1,900次而不是它现在可以处理的910-911次,然后才关闭而没有错误。如果有更好的方法,请告诉我,任何建设性的批评总是受到赞赏!

1 个答案:

答案 0 :(得分:0)

您有一个具有BitmapClass实例的Tile类。也许这应该是一个静态属性(属于类,而不是每个实例)开始。我的猜测是,在你实例化一个你可能不想做的单个图块时,你每次都会使用整个图块的内存。

我注意到的另一件事是你正在为每个图块创建一个新的BitmapData,而实际上你可能只需要图​​块数据(它的id / coordinates),这样你就可以将像素复制到最终的BitmapData中。阶段。也许您需要一个类来管理资源(嵌入式位图)和另一个来管理不同的Tile实例(它应该保存渲染数据和对像素的引用,但不应该存储实际数据)并复制到主缓冲区。

此外,在对图像执行多个像素操作时,最好使用BitmapData的lock()和unlock()函数来提高性能。

查看Lee Brimelow的Sprite Sheet教程(部分12,尤其是3)。它们非常容易理解和有用。

Lee Brimelow's sprite sheet tutorial

此外,看看GPU加速IsoHill可能值得一看。 图书馆。

IsoHill

之前我曾使用过{Hm} a project并且速度非常快,但最好先熟悉基础知识,否则这可能看起来有点多了。

Hirsch&Mann project for Siemens using IsoHill