好的,所以我正在尝试创建一个程序,从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次,然后才关闭而没有错误。如果有更好的方法,请告诉我,任何建设性的批评总是受到赞赏!
答案 0 :(得分:0)
您有一个具有BitmapClass
实例的Tile类。也许这应该是一个静态属性(属于类,而不是每个实例)开始。我的猜测是,在你实例化一个你可能不想做的单个图块时,你每次都会使用整个图块的内存。
我注意到的另一件事是你正在为每个图块创建一个新的BitmapData,而实际上你可能只需要图块数据(它的id / coordinates),这样你就可以将像素复制到最终的BitmapData中。阶段。也许您需要一个类来管理资源(嵌入式位图)和另一个来管理不同的Tile实例(它应该保存渲染数据和对像素的引用,但不应该存储实际数据)并复制到主缓冲区。
此外,在对图像执行多个像素操作时,最好使用BitmapData的lock()和unlock()函数来提高性能。
查看Lee Brimelow的Sprite Sheet教程(部分1,2,尤其是3)。它们非常容易理解和有用。
此外,看看GPU加速IsoHill可能值得一看。 图书馆。
之前我曾使用过{Hm} a project并且速度非常快,但最好先熟悉基础知识,否则这可能看起来有点多了。