Image AS3嵌入图像类,然后将这些图像放入另一个类?

Image AS3嵌入图像类,然后将这些图像放入另一个类?,image,actionscript-3,air,embed,Image,Actionscript 3,Air,Embed,例如,现在我有一个叫做“Balls.as”的类。这里我加载10个不同的球图像。你知道,就像这样: [Embed(source = "/ball1.png")] [Embed(source = "/ball2.png")] 问题是如果我产生5个球,这些球的图像会被嵌入5*5次,对吗?如果我错了,请纠正我!所以我想,我不能上一节课吗?加载这些图像一次,然后加载到球中。因为我现在可以加载我想要的任何球?最佳做法是使用一个资产类,该类将包含静态嵌入图像,如下所示: [Embed(source="bal

例如,现在我有一个叫做“Balls.as”的类。这里我加载10个不同的球图像。你知道,就像这样:

[Embed(source = "/ball1.png")]
[Embed(source = "/ball2.png")]

问题是如果我产生5个球,这些球的图像会被嵌入5*5次,对吗?如果我错了,请纠正我!所以我想,我不能上一节课吗?加载这些图像一次,然后加载到球中。因为我现在可以加载我想要的任何球?

最佳做法是使用一个
资产类,该类将包含静态嵌入图像,如下所示:

[Embed(source="ball1.png")]
public static var BallImage1:Class;
然后,您只需为加载的
位图声明一个变量并使用它,如下所示:

protected var mBall1:Bitmap = new Assets.BallImage1() as Bitmap;
这将创建加载图像的
位图
实例,然后您可以将其添加到显示列表中。每个图像只加载一次,所有图像都可以从每个类访问。

您不需要“加载”它们,它们是嵌入的。您只需实例化图像。最好有一个类来管理共享资源,例如:

public class TextureAssets 
{
    [Embed(source = "../lib/ball1.png")]
    private static var Ball1:Class;

    [Embed(source = "../lib/ball2.png")]
    private static var Ball2:Class;

    public static var ball1Texture:BitmapData;
    public static var ball2Texture:BitmapData;

    public static function init():void
    {
        ball1Texture = (new Ball1() as Bitmap).bitmapData;
        ball2Texture = (new Ball2() as Bitmap).bitmapData;
    }
然后调用
TextureAssets.init()
一次(例如在Main.as中) 需要位图数据时:使用
新位图(TextureAssets.ball1Texture)

这样,您的程序只需要使用一个位图数据所需的内存,而不需要使用多个最终相同的内存。
如果需要在保留原始位图数据的同时对位图数据执行操作,可以使用:

var modified:bitmapData = TextureAssets.ballTexture.clone();

此外,如果要实例化一个类中的所有balls图像,最好放弃静态访问,而是在构造函数中初始化BitMapData,创建一个新的TextureAsets()并通过变量调用纹理

(静态字段访问比直接(.)访问慢:)

谢谢!今晚晚些时候我会调查的!我同意静态字段访问比直接访问慢,但我认为在这种情况下,最好集中精力于代码管理和易用性,而不是次要的性能提升。@Gio:主要的一点是,如果要共享同一个映像并保持不变,则只需构建一次bitmapData。上面的代码为每次调用“var mBall1:Bitmap=new Assets.BallImage1()as Bitmap;”创建一个新的bitmapData对象如果user1941346在从显示列表中删除mBall1.bitmapData.dispose()或失去引用之前不调用它,这将导致内存泄漏。除了每次构建一个新的bitmapData的成本外,对于100次调用,还有一个大约100次的差异。500 kb用于64x64 png,与上述方法的大约100 kb形成对比。好的。。我可能错了,但是调用clone方法也会创建一个新的
BitmapData
对象并返回它(至少,文档中是这么说的)。只有在需要“修改位图数据”(如颜色转换或过滤器)以保留原始数据时,我才给出克隆示例。