2

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

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

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

[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”关键字创建的所有资产都将引用存储在内存中的图像的单个实例,并在内存中的其他地方创建自己的唯一副本?

接下来,关于类中的cacheAsBitmapcacheAsBitmapMatrix参数Bitmap,设置这些属性在使用嵌入式资产时会起到什么作用吗?

最后,在 AS3 中缩放位图时,使用类的scaleXscaleY属性更有效Bitmap,还是BitmapData使用缩放矩阵重新绘制更好?

提前感谢您的帮助!

4

1 回答 1

2

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

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

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

...如果您想稍后访问它,可以通过 Bitmap 实例进行:

uniqueBitmap.bitmapData;

但是,这会在内存中创建另一个 BitmapData 对象,因此只有在您确实需要单独操作它时才这样做。

至于第二部分,如果缩放是为了纯粹的视觉效果(例如在游戏中)并且足够频繁,我个人会使用包装位图的 scaleX 和 scaleY - 使用矩阵不会调整您的 BitmapData 的大小,它会创建它的缩放副本,因此使用此方法进行常见转换可能并不理想,因为您每次都在创建新的 BitmapData 实例,尤其是在您针对移动设备时。这真的取决于你的目的 - 我可以问你想要做什么吗?

于 2012-10-22T23:33:42.627 回答