我对Flash如何处理图像资产有一些矛盾的误解。我打算把它们写在这里,请在我错的地方纠正我。
我有一个嵌入式图片
[Embed(source = "../../lib/images/myImage.png")]
public var embeddedImage:Class;
如何在不使用不合理数量的操作内存的情况下在我的应用中使用它?
我打算这样做:
var bData:BitmapData = (new embeddedImage() as Bitmap).bitmapData;
从那时起使用bData如果我想在任何地方显示这张图片,确保每张图片只有一个bitmapdata。
但令我担心的是,embeddedImage仍然存在,不是吗?在操作记忆中基本上有两个这个图像的副本,对吗?
我该怎么做?可能每次我想使用它时都应该实例化新的embeddedImage()?但这看起来更糟,现在我清楚地实例化了一堆不需要的副本。
如果我使用Loader类加载图像,如果我愿意的话,我最终只会得到一个bitmapdata副本,前提是GC在完成后清除加载器时做得很好。
答案 0 :(得分:2)
[Embed]
块将图像嵌入到应用程序中。这不使用RAM *,它会增加应用程序本身的大小(.swf
或您导出的任何格式)。
使用new EmbeddedImage()
时,可以创建嵌入图像的实例。这个实例消耗RAM。该图像的每个实例都将占用额外的RAM。
当您访问该嵌入式映像的bitmapData
属性时,它不会创建新实例或消耗额外的RAM,而是指现有数据已占用RAM。
因为BitmapData
是代表图像的数据,所以它显然是最大的。知道了这一点,我们就会研究如何将BitmapData的单个实例用于我们想要显示的任何图形。根据您选择使用的显示架构,在绘制同一图像的多个实例时,有不同的方法可以引用该BitmapData。
例如,我们创建了EmbeddedImage
的实例:
var embeddedImage:EmbeddedImage = new EmbeddedImage();
我们有一个'画布',它是一个添加到舞台上的Bitmap
:
var canvas:Bitmap = new Bitmap();
canvas.bitmapData = new BitmapData(500, 500, false, 0xFFFFFF);
addChild(canvas);
使用方法copyPixels()
,我们可以将embeddedImage
中的一部分数据复制到canvas
,而无需创建BitmapData
的另一个实例,每次我们想要绘制图形时,消耗相当于源的RAM。例如:
var drawPosition:Point = new Point();
var sourceRect:Rectangle = embeddedImage.bitmapData.rect;
// Draw the embeddedImage 50 times.
canvas.bitmapData.lock();
for(var i:int = 0; i < 50; i++)
{
canvas.bitmapData.copyPixels(embeddedImage.bitmapData, sourceRect, drawPosition);
drawPosition.x += 10;
}
canvas.bitmapData.unlock();