0

我在 Flash 中有一个 100 帧的 MovieClip。每个框架都包含一个我需要在项目中使用的图标。我在需要图标出现的任何地方创建此图标 MovieClip 的实例,并gotoAndStop在某个帧上显示该图标。

每当我创建 MovieClip 的实例时,将 100 个图标存储在单个影片剪辑中会导致在内存中创建每个图标吗?如果我将每个图标存储在库中并仅附加所需的图标,那么这会比创建包含所有图标的 MovieClip 消耗更少的内存吗?

4

3 回答 3

2

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

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

如果您想走只实例化一次的路线,我建议您使用延迟加载,您只在第一次使用时实例化每个图标。一种方法是使用已有的内容并在一次使用特定图标时访问框架,然后存储 BitmapData 或对图标本身的引用并重用它。另一种方法是构建一个 swc并使用类似的模式。

这些都不需要静态变量顺便说一句,因为听起来你没有使用大量不同的图标 MC 副本。即使您是,最好通过依赖注入处理引用您拥有的图标。

但是,我认为您可能会询问文件大小与实际内存使用情况。问题的答案是,您的 fla 使用的所有资源都被编译到 swf 中,无论它们是在 MovieClip、SWC 还是在库中并选中了“帧 N 中的 Export for Actionscript”。

我明白了,我有胸部,我猜
试试这个,以验证我的“猜测”。

  1. 创建一个在第 1 帧具有关键帧的 swf。
  2. 在那里画一个圆圈。
  3. 在第 10 帧上放置另一个关键帧。画一个正方形。
  4. 在发布设置中,选中“生成大小报告”。

现在,您知道(或者您应该知道)这个 swf 可以在第 1 帧显示圆圈,即使在第 10 帧编译的资源尚未下载。那么,在下载第 10 帧之前,有什么方法可以将正方形加载到内存中?提示:答案是否定的。

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

Macromedia 工程师做了很多事后看来相当愚蠢的事情,但他们并没有那么无能。

于 2013-04-13T21:44:26.673 回答
1

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

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

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

于 2013-04-13T19:48:37.767 回答
1

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

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

例如

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,或者在运行时生成一个 SpriteSheet,然后将其保存为文件,然后copyPixels()从主 spritesheet 的右侧矩形粘贴图标。您有多种工具可用于生成 spritesheet:

还有一些方法可以在运行时生成 spritesheet

对于 Lee Brimelow 的关于 spritesheets 和 BitmapData 的一些很好解释的视频教程:Sprite Sheets and Blitting - Part 1 , 2 and 3

于 2013-04-13T20:54:12.520 回答