2012-10-22 29 views
2

我确信这些主题已经被打败了,但我有一个非常具体的问题,我一直无法找到答案。在AS3中嵌入资产,位图缓存和位图转换

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

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

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

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

最后,在AS3缩放的位图时,它是更有效的使用Bitmap类的scaleXscaleY属性,或者是它更好使用比例矩阵重绘BitmapData

在此先感谢您的帮助!

回答

2

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

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

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

...如果你想稍后访问此,你能做到这一点通过Bitmap实例:

uniqueBitmap.bitmapData; 

然而,这在内存中创建另一个BitmapData对象,所以只有这样做,如果你确实需要单独操作它。

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

+0

感谢有关位图资料的信息..我将在明天进行一些测试。 就缩放而言,我缩放内容的全部原因是为了适应不同的移动设备分辨率。源纹理将为640x960(iPhone4),但我希望它可以在许多设备上工作,包括不同分辨率的设备,因此我需要在图形加载时缩放图形,以便它们适合设备的窗口。 原因我这样做是因为使用stage.ScaleMode似乎并不适合我,但也许这是因为我使用Flixel。 – Eternalspirit

+1

好吧 - 在这种情况下,您确实需要矩阵 - scaleX/Y需要在每帧中进行计算,所以如果您的位图只需缩放几帧(即动画缩小它),则非常有用,但会不必要地计算每一帧(如果你只是改变它们一次) - 如果你想永久变换,一次性使用矩阵。希望这不会让你困惑,让我知道它是否有! – MickMalone1983

+0

是的,我只需要缩放一次,然后随时使用缩放的BitmapData。我不需要重新计算每一帧的比例,因为我希望图像总是被缩放。 – Eternalspirit