Actionscript 3 使用多帧MovieClip最大限度地减少内存使用

Actionscript 3 使用多帧MovieClip最大限度地减少内存使用,actionscript-3,flash,movieclip,Actionscript 3,Flash,Movieclip,我有一部100帧的Flash电影。每个框架都包含我需要在项目中使用的特定图标。我在需要显示图标的任何位置创建此图标MovieClip的实例,并在特定帧上显示该图标 在一个movieclip中存储100个图标会导致每当我创建一个movieclip实例时在内存中创建每个图标吗?如果我将每个图标存储在库中,并只附加所需的图标,这会比创建包含所有图标的MovieClip消耗更少的内存吗?如果您的图标是位图,则每个MovieClip将共享相同的数据-唯一的内存增加将是由于更多的MovieClip,而不是它

我有一部100帧的Flash电影。每个框架都包含我需要在项目中使用的特定图标。我在需要显示图标的任何位置创建此图标MovieClip的实例,并在特定帧上显示该图标


在一个movieclip中存储100个图标会导致每当我创建一个movieclip实例时在内存中创建每个图标吗?如果我将每个图标存储在库中,并只附加所需的图标,这会比创建包含所有图标的MovieClip消耗更少的内存吗?

如果您的图标是位图,则每个MovieClip将共享相同的数据-唯一的内存增加将是由于更多的MovieClip,而不是它们的内容(这不应该是个问题)

如果您的图标不是位图(其他电影嘴唇、形状、按钮等),那么所有内容都会被复制,因此随着更多电影嘴唇的添加,内存使用会增加得更快


另一个考虑是,屏幕上的许多电影片段对FPS的影响要比简单的对象更大,因此,即使你使用位图,你也可以考虑添加图标本身而不是电影封面。

< P>如果你的图标是Bitmaps,那么每个电影节将共享相同的数据。电影的嘴唇,而不是他们的内容(这不应该是一个问题)

如果您的图标不是位图(其他电影嘴唇、形状、按钮等),那么所有内容都会被复制,因此随着更多电影嘴唇的添加,内存使用会增加得更快


另一个考虑是,屏幕上的许多电影片段对FPS的影响要比简单的对象更大,所以即使你在使用位图,你也可以考虑添加图标本身而不是电影封面。

< P>如果进入100帧电影的每个图标都是一个图像,你就可以很容易地输出ActoSc的图像。只访问您需要的图像

另一个想法是创建一个静态类,将每个图标帧作为符号存储在静态数组(如果您希望通过索引访问图标)或字典(如果您希望通过名称检索图标)中

e、 g

包{
导入flash.display.Bitmap;
公共类图标{
公共静态常量资源:Vector.=Vector.([new Icon01ASExportName(),//实例位图一次
新建Icon02ASExportName(),//以后多次重复使用
...
新Icon99ASExportName());
}
}
另一种方法是在运行时生成一次精灵表并将其保存为文件,然后从主精灵表的右矩形粘贴图标。您有多种工具可用于生成精灵表:

  • (如果您有movieclips,您可以将其导出为图像序列以放入软件中)
还有一些方法可以解决这个问题


对于Lee Brimelow关于spritesheets和BitmapData的一些精辟解释的视频教程:Sprite Sheets和Blitting-Part,以及。

如果进入100帧MovieClip的每个图标都是一个图像,那么您可以很容易地导出该图像以用于actionscript,并仅访问您需要的图像

另一个想法是创建一个静态类,将每个图标帧作为符号存储在静态数组(如果您希望通过索引访问图标)或字典(如果您希望通过名称检索图标)中

e、 g

包{
导入flash.display.Bitmap;
公共类图标{
公共静态常量资源:Vector.=Vector.([new Icon01ASExportName(),//实例位图一次
新建Icon02ASExportName(),//以后多次重复使用
...
新Icon99ASExportName());
}
}
另一种方法是在运行时生成一次精灵表并将其保存为文件,然后从主精灵表的右矩形粘贴图标。您有多种工具可用于生成精灵表:

  • (如果您有movieclips,您可以将其导出为图像序列以放入软件中)
还有一些方法可以解决这个问题


Lee Brimelow关于spritesheets和BitmapData的精辟视频教程:Sprite Sheets和Blitting-Part,和。

回答您的问题:当您转到带有图标的帧时,Flash将创建该图标的新实例。当您离开该帧时,Flash将使该图标符合垃圾收集的条件,除非您强制它以某种方式将实例保存在内存中,例如使用AddEventListener,其中作为侦听器的方法是图标或其内部某处

我认为与新实例相比,goToAndStop的内存使用率可能更高,通过每次从一个图标切换到另一个图标时实例化一个新图标,您不太可能遇到额外的问题。其他回答的人非常正确,通过仅实例化一次所有图标(通过任何方法),您将使用更少的CPU周期,然后每次使用该图标时只需使用同一个图标。但是,您的总体内存占用将更高,因为所有图标(即使是您当前未使用的图标)都将始终位于内存中

如果你想一次只实例化每个图标,我建议你使用延迟加载,在第一次使用图标时只实例化每个图标。一种方法是使用你已经拥有的,并在第一次使用sp时访问框架
package{

    import flash.display.Bitmap;

    public class Icons{

        public static const assets:Vector.<Bitmap> = Vector.<Bitmap>([new Icon01ASExportName(),//instance bitmaps once
                                                                      new Icon02ASExportName(),//reuse them later multiple times
                                                                      ...
                                                                      new Icon99ASExportName()]);
    }

}