我在 Flash 中有一个 100 帧的 MovieClip。每个框架都包含一个我需要在项目中使用的图标。我在需要图标出现的任何地方创建此图标 MovieClip 的实例,并gotoAndStop
在某个帧上显示该图标。
每当我创建 MovieClip 的实例时,将 100 个图标存储在单个影片剪辑中会导致在内存中创建每个图标吗?如果我将每个图标存储在库中并仅附加所需的图标,那么这会比创建包含所有图标的 MovieClip 消耗更少的内存吗?
我在 Flash 中有一个 100 帧的 MovieClip。每个框架都包含一个我需要在项目中使用的图标。我在需要图标出现的任何地方创建此图标 MovieClip 的实例,并gotoAndStop
在某个帧上显示该图标。
每当我创建 MovieClip 的实例时,将 100 个图标存储在单个影片剪辑中会导致在内存中创建每个图标吗?如果我将每个图标存储在库中并仅附加所需的图标,那么这会比创建包含所有图标的 MovieClip 消耗更少的内存吗?
回答您的问题:当您转到带有图标的框架时,Flash 将创建该图标的新实例。当您离开该帧时,Flash 将使该图标符合垃圾收集条件,除非您以某种方式强制它将实例保存在内存中,例如使用 addEvenListener ,其中作为侦听器的方法是图标或其中的某个位置。
我认为 goToAndStop 与新实例的内存使用量可能会更高。如果您在使用 goToAndStop() 时没有遇到问题,那么每次从一个图标切换到另一个图标时都实例化一个新图标,您不太可能遇到其他问题。其他回答的人是非常正确的,您将通过只实例化所有图标一次(通过任何方法)来使用更少的 CPU 周期,然后每次使用该图标时只需使用同一个图标。但是,您的整体内存占用会更高,因为您将始终在内存中拥有所有图标(甚至是您当前未使用的图标)。
如果您想走只实例化一次的路线,我建议您使用延迟加载,您只在第一次使用时实例化每个图标。一种方法是使用已有的内容并在第一次使用特定图标时访问框架,然后存储 BitmapData 或对图标本身的引用并重用它。另一种方法是构建一个 swc并使用类似的模式。
这些都不需要静态变量顺便说一句,因为听起来你没有使用大量不同的图标 MC 副本。即使您是,最好通过依赖注入处理引用您拥有的图标。
但是,我认为您可能会询问文件大小与实际内存使用情况。该问题的答案是,您的 fla 使用的所有资源都被编译到 swf 中,无论它们是在 MovieClip、SWC 还是在库中并选中了“帧 N 中的 Export for Actionscript”。
我明白了,我有胸部,我猜
试试这个,以验证我的“猜测”。
现在,您知道(或者您应该知道)这个 swf 可以在第 1 帧显示圆圈,即使在第 10 帧编译的资源尚未下载。那么,在下载第 10 帧之前,有什么方法可以将正方形加载到内存中?提示:答案是否定的。
现在问问自己:您是否认为 Macromedia 编写了一个特殊版本的 MC,它无法延迟加载,而作为 Flash 为您在上面制作的电影生成的主要文档类的 MC 显然处理得很好?
Macromedia 工程师做了很多事后看来相当愚蠢的事情,但他们并没有那么无能。
如果您的图标是位图,那么每个影片剪辑将共享相同的数据 - 唯一的内存增加将是由于更多的影片剪辑,而不是它们的内容(这不应该是一个问题)。
如果您的图标不是位图(其他动画剪辑、形状、按钮等),那么所有内容都会被复制,因此随着添加更多动画剪辑,内存使用量会增加得更快。
另一个考虑因素是屏幕上的大量动画剪辑对 FPS 的影响比简单的对象更大,因此即使您使用的是位图,您也可能需要考虑添加图标本身而不是动画剪辑。
如果进入 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。