在AS3中嵌入资源,位图缓存和位图转换

时间:2012-10-22 23:18:55

标签: actionscript-3 mobile

我确信这些话题已经被打死了,但我有一个非常具体的问题,我一直无法找到答案。

我在我的程序中正在做的是嵌入几个艺术资产以供使用,扩展它们以支持多个移动平台然后继续前进。

我已经读过位图缓存是提高移动应用程序性能的好方法。对于嵌入式资产,这只是制作嵌入式资产的单个实例并多次使用它的行为吗?例如:

[Embed(source = "png.png")] private static var img:Class;
private static var data:BitmapData = new img().bitmapData;

private var bmp1:Bitmap = new Bitmap(data); private var bmp2:Bitmap = new Bitmap(data);

我假设在这种情况下,使用“new”关键字创建的所有资源都将引用存储在内存中的图像的单个实例,并在某处创建自己的唯一副本在记忆中还有吗?

接下来,关于cacheAsBitmap类中的cacheAsBitmapMatrixBitmap参数,在使用嵌入资源时,设置这些属性会做什么吗?

最后,在AS3中缩放位图时,使用scaleX类的scaleYBitmap属性是否更有效,或者重绘{{1}更好使用比例矩阵?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

是的,只有一个从嵌入文件中提取的BitmapData实例。这样可以节省内存,但确实意味着更改BitmapData会影响引用它的所有位图 - 但是如果您不想编辑BitmapData本身,或者您希望它更新它们,那么这不是问题。

使用new关键字创建的每个位图都将是内存中的唯一对象,但它们都会为其内容引用相同的BitmapData(data) - 将BitmapData视为像素的核心描述数据和Bitmap作为包装器,允许在舞台上绘制数据。您在代码中创建的每个位图都引用相同的BitmapData,如果您想为Bitmap提供数据的唯一副本,请将其实例化:

var uniqueBitmap:Bitmap = new Bitmap(data.clone());

...如果以后想要访问它,可以通过Bitmap实例来实现:

uniqueBitmap.bitmapData;

但是,这会在内存中创建另一个BitmapData对象,所以只有在你真正需要单独操作它时才这样做。

至于第二部分,我个人会使用scaleX& scaleY of wrapper Bitmap如果缩放是为了纯粹的视觉效果(例如在游戏中)并且足够频繁 - 使用Matrix不会调整你的BitmapData的大小,它会创建它的缩放副本,所以使用这种方法进行常见的变换可能并不理想,因为您每次都在创建一个新的BitmapData实例,特别是如果您的目标是移动设备。这真的取决于你的目的 - 我可以问你想做什么吗?