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

Posted

技术标签:

【中文标题】AS3 嵌入图像类,然后将这些图像放入另一个类?【英文标题】:AS3 Embed images class and then get these images into another class? 【发布时间】:2013-01-11 00:43:21 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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 中) 当您需要位图数据时:使用new Bitmap(TextureAssets.ball1Texture) 这样,您的程序只需要使用一个 bitmapData 所需的内存,而不是使用许多最终相同的内存。 如果您需要在保留原始数据的同时对 bitmapData 执行操作,您可以使用:

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

另外,如果您从一个类中实例化所有球图像,最好放弃静态访问,而是在构造函数中初始化 bitmapDatas,创建一个新的 TextureAssets() 并通过变量调用纹理 (静态字段访问比直接(.)访问慢:http://jacksondunstan.com/articles/1690)

【讨论】:

我同意静态字段访问比直接访问要慢,但我认为对于这种情况,最好专注于代码管理和易用性,而不是较小的性能提升。 @Gio :如果要共享相同的图像并保持不变,那么主要的一点是要构建一次 bitmapData。上面的代码为每次调用 'var mBall1:Bitmap = new Assets.BallImage1() as Bitmap;' 创建一个新的 bitmapData 对象如果 user1941346 在将其从显示列表中删除或丢失引用之前未调用 mBall1.bitmapData.dispose(),这将导致内存泄漏。除了每次构建一个新的 bitmapData 的成本之外,对于 100 次调用,还有 aprox 的差异。小 64x64 png 需要 500 kb,而上述方法大约需要 100 kb。 好吧.. 我可能错了,但调用 clone 方法也会创建一个新的 BitmapData 对象并返回它(至少,这是文档所说的)。 help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/… 我只在需要“修改 bitmapData”(如颜色转换或过滤器)以保留原件时才给出克隆示例。【参考方案2】:

最好的做法是有一个 Assets 类,其中包含静态嵌入图像,如下所示:

[Embed(source="ball1.png")]
public static var BallImage1:Class;

那么你所要做的就是为你加载的Bitmap声明一个变量并使用它,就像这样:

protected var mBall1:Bitmap = new Assets.BallImage1() as Bitmap;

这将创建一个已加载图像的Bitmap 实例,然后您可以将其添加到显示列表中。每张图片只会加载一次,您的所有图片都触手可及,可以从您拥有的每个班级访问。

【讨论】:

谢谢!今晚晚些时候我会试着调查一下!

以上是关于AS3 嵌入图像类,然后将这些图像放入另一个类?的主要内容,如果未能解决你的问题,请参考以下文章

AS3 / AIR:尝试上载文件时出现IOStream错误

将对象放入容器类时,OpenGL 不绘制

ActionScript 3 as3全背景图像类

如何在 Kivy 中将图像放入动态文本中

触摸时 UITableViewCell 图像发生变化

在 AS3 中包含图像比嵌入更好的方法?