AS3 从图块表中批量裁切图块的最佳方法?

Posted

技术标签:

【中文标题】AS3 从图块表中批量裁切图块的最佳方法?【英文标题】:AS3 best way to mass crop tiles from a tilesheet? 【发布时间】:2014-03-02 17:49:44 【问题描述】:

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

这是我从 tilesheet 绘制图块的代码。

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】:

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

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

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

查看 Lee Brimelow 的 Sprite Sheet 教程(部分 1、2 尤其是 3)。它们真的很容易理解和有用。

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

我之前使用过 IsoHill for a project,速度相当快,但最好先熟悉基础知识,否则可能看起来有点多。

【讨论】:

非常感谢!我终于让它工作了,它也确实优化了!

以上是关于AS3 从图块表中批量裁切图块的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

这是使用 OpenGL 渲染图块的有效方法吗?

使用 UIImage imageNamed 方法渲染图块的性能问题

CAD图块的创建与粘贴使用

Tiled Editor 图块的两种导入方式

更改 SKTileMapNode 中特定图块的颜色

osmdroid - 显示更大的图块