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 从图块表中批量裁切图块的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章