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

时间:2013-04-13 18:47:43

标签: actionscript-3 flash movieclip

我在Flash中有一个100帧的MovieClip。每个框架都包含一个我需要在项目中使用的图标。我创建了这个图标MovieClip的实例,只要我需要一个图标来显示,并gotoAndStop到某个帧来显示该图标。

每当我创建一个MovieClip实例时,是否会在一个动画片段中存储100个图标会导致每个图标都在内存中创建?如果我在库中存储了每个图标并仅附加了所需的图标,那么创建具有所有图标的MovieClip会消耗更少的内存吗?

3 个答案:

答案 0 :(得分:2)

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

我认为goToAndStop与新实例的内存使用率可能会更高。如果您没有遇到goToAndStop()的问题,则每次从一个图标切换到另一个图标时,通过实例化新图标不太可能遇到其他问题。其他人已经回答是非常正确的,你只需要通过一次实例化所有图标(通过任何方法)来减少CPU周期,然后每次使用该图标时只使用相同的图标。但是,您的整体内存占用量会更高,因为您将始终在内存中拥有所有图标(即使您当前未使用的图标)。

如果你想要只进行一次实例化的路由,我建议你使用Lazy Loading,你只能在第一次使用它时实例化每个图标。一种方法是使用您已有的内容并访问第一次时间框架,然后使用特定图标,然后在此之后存储BitmapData或图标本身的引用并重复使用。另一种方法是build a swc并使用类似的模式。

这些都不需要静态变量BTW,因为听起来你没有使用大量不同的图标MC副本。即使你是,也可以通过dependency injection来处理你所拥有的图标。

我认为您可能会询问文件大小,而不是实际内存使用情况。 问题的答案是你的fla使用的所有资产都被编译到swf中,无论它们是在MovieClip,SWC中,还是在包含Export for Actionscript的库中N检查。

我知道了,我有胸部,我猜是
试试这个,验证我的“猜测”。

  1. 创建一个在第1帧上有关键帧的swf。
  2. 在那里画一个圆圈。
  3. 在第10帧上放置另一个关键帧。画一个正方形。
  4. 在“发布设置”中,选中“生成大小报告”。
  5. 现在,您知道(或者您应该知道)此swf可以在第1帧上显示圆圈,即使尚未下载在第10帧上编译的资产。那么,是否有任何可能的方式在下载第10帧之前可以将方块加载到内存中?提示:答案是否定的。

    现在问问自己:你认为Macromedia编写了一个特殊版本的MC,它是无法延迟加载的MC,它是Flash为你上面制作的电影生成的主要文档类所以显然处理得那么好?

    Macromedia工程师做了很多事情,事后看起来很愚蠢,但他们并不 无能。

答案 1 :(得分:1)

如果你的图标是Bitmaps,那么每个动画片段将共享相同的数据 - 唯一的内存增加将归因于更多的动画片段,而不是它们的内容(这不应该是一个问题)。

如果你的图标不是位图(其他动画片段,形状,按钮等),那么一切都会重复,因此随着更多动画片段的添加,内存使用量会增加很多。

另一个考虑因素是屏幕上的大量动画片段对FPS的影响比简单对象更多,因此即使您使用的是位图,也可以考虑添加图标本身而不是动画片段。

答案 2 :(得分:1)

如果进入100帧MovieClip的每个图标都是图像,您可以轻松地将该图像导出为actionscript并仅访问您需要的图像。

另一个想法是创建一个静态类,将每个图标框架存储为静态数组中的符号(如果要通过索引访问图标)或字典(如果要按名称检索它)。

e.g。

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()]);
    }

}

另一种方法是生成一个SpriteSheet,或者在运行时将其保存为文件,然后copyPixels()粘贴主spritesheet的右边矩形图标。您有多个工具可用于生成spritesheet:

还有generate a spritesheet at runtime的方式。

有关spritesheets和BitmapData的一些精彩解释的视频教程,由Lee Brimelow编写:Sprite Sheets and Blitting - Part 123