滤镜和 SWF 文件性能
如果在应用程序中使用太多滤镜,则会占用大量内存,从而影响到 Flash Player 的性能。 由于附加了滤镜的影片剪辑有两个 32 位位图,因此如果使用过多位图,这些位图会导致应用程序占用大量内存。 计算机操作系统可能出现内存不足错误。 在现在的计算机中,内存不足错误应该很少出现,除非在一个应用程序中过多地使用滤镜效果(例如,在舞台中存在数千个位图)。
但是,如果您确实遇到内存不足错误,则将出现以下情况:
滤镜数组被忽略。
使用常规矢量渲染器绘制影片剪辑。
不为影片剪辑缓存任何位图。
在出现内存不足错误后,影片剪辑绝不会尝试使用滤镜数组或位图缓存。 影响播放器性能的另一个因素是您对所应用的每个滤镜的“quality”参数使用的值。 该值越高,则呈现所需的 CPU 时间和内存就越多,而将“quality”参数设置为较低的值就只需要较少的计算机资源。 因此,应避免使用过多的滤镜,并且尽可能使用较低的品质设置。
重要说明: 如果 100 x 100 像素的对象放大一倍,那么它将使用四倍的内存,因为现在的内容尺寸为 200 x 200 像素。 如果再放大两倍,则该形状将绘制为 800 x 800 像素的对象,而它使用的内存为最初的 100 x 100 像素对象所使用内存的 64 倍。 无论何时,只要在 SWF 文件中使用滤镜,都应禁用 SWF 文件上下文菜单中的缩放菜单选项。
如果使用了无效的参数类型,则可能遇到错误。 有些滤镜参数还有一个特定的有效范围。 如果设置了有效范围之外的值,则该值将更改为该范围之内的某个有效值。 例如,对于标准操作而言,品质应该是介于 1 到 3 之间的一个值,并且只能设置为介于 0 到 15 之间的值。 任何大于 15 的值将设置为 15。
有些构造函数对所需的作为输入参数的数组长度具有限制。 如果使用无效数组(大小不正确)创建卷积滤镜或颜色矩阵滤镜,则构造函数将失败,且无法成功创建滤镜。 如果随后将该滤镜对象用作影片剪辑滤镜数组的一项,将忽略该对象。
使用模糊滤镜时,如果用于 blurX 和 blurY 的值是 2 的整数次幂(例如 2、4、8、16 和 32),则可以加快计算速度,并且可以使性能提高 20% 到 30%。
位图缓存和SWF文件性能
位图缓存有助于增强应用程序中不会更改的影片剪辑的性能。 将 MovieClip.cacheAsBitmap 或 Button.cacheAsBitmap 属性设置为true 时,Flash Player 将缓存影片剪辑或按钮实例的内部位图表示形式。 这可以提高包含复杂矢量内容的影片剪辑的性能。 具有已缓存位图的影片剪辑的所有矢量数据都会绘制到位图而不是主舞台。
注: 位图将复制到主舞台,作为对齐到最接近像素边界的未拉伸、未旋转的像素。 像素与父对象进行一对一映射。 如果位图的范围发生更改,将重新创建位图而不是进行拉伸。
有关缓存按钮或影片剪辑实例的详细信息,请参阅以下主题:
学习使用 Adobe Flash 中的 ActionScript 2.0 中的“关于使用 ActionScript 缓存和滚动影片剪辑”
学习使用 Adobe Flash 中的 ActionScript 2.0 中的“缓存影片剪辑”
对主要包含静态内容且不频繁缩放和旋转的影片剪辑使用 cacheAsBitmap 属性。 对于这样的影片剪辑,使用 cacheAsBitmap 属性可在转换影片剪辑时(当其 x 和 y 位置更改时)提高性能。
对影片剪辑启用缓存可以创建一个表面,这有多个好处,如有助于快速呈现复杂的矢量动画。 在某些情况下,启用缓存不但不会提高性能,反而会降低性能。
缓存数据的总体性能取决于实例的矢量数据的复杂程度、要更改的数据量以及是否设置了 opaqueBackground 属性。 如果要更改的区域很小,则使用表面和使用矢量数据的差异可能微乎其微。 部署应用程序之前,实际测试一下这两种情形。
何时使用位图缓存
在下面的典型情形下,通过优化矢量图形启用位图缓存时,您可能会看到此操作的明显好处。
复杂背景图像
包含矢量数据的详细的复杂背景图像的应用程序。 若要提高性能,请选择内容,将其存储到影片剪辑中,然后将 opaqueBackground 属性设置为 True。 背景将呈现为位图,可以迅速重新绘制,以便更快地播放动画。
滚动文本字段
在滚动文本字段中显示大量文本的应用程序。 将文本字段放置在通过滚动框(scrollRect 属性)设置为可滚动的影片剪辑中,能够加快指定实例的像素滚动。 当用户滚动影片剪辑实例时,滚动过的像素将移向上方,并生成新出现的区域,而不是重新生成整个文本字段。
窗口系统
具有重叠窗口的复杂系统的应用程序。 每个窗口都可以打开或关闭(例如,Web 浏览器窗口)。 如果将每个窗口标记为一个表面(将 cacheAsBitmap 属性设置为 True),则各个窗口将隔离开并进行缓存。 用户可以拖动窗口使其互相重叠,每个窗口无需重新生成矢量内容。
何时避免使用位图缓存
滥用位图缓存会对 SWF 文件产生负面影响。 在开发使用表面的 FLA 文件时,要牢记以下原则:
不要过度使用表面(启用了缓存的影片剪辑)。 每个表面比常规影片剪辑将使用更多的内存;启用表面只是为了提高呈现性能。
缓存的位图使用的内存比常规影片剪辑实例多很多。 例如,如果舞台上的影片剪辑大小为 250 x 250 像素,则对其进行缓存时可能会使用 250 KB 内存;如果是常规(未缓存的)影片剪辑实例,则可能使用 1 KB 内存。
避免放大缓存的表面。 如果过度使用位图缓存,尤其是放大内容时,将占用大量内存(请参阅上一段落)。
对主要为静态(非动画)的影片剪辑实例使用表面。 可以拖放或移动实例,但实例的内容不能为动画或更改太多。 例如,如果旋转或转换实例,实例将在表面和矢量数据之间进行变化,这种情况难于处理,并会对 SWF 文件产生负面影响。
如果将表面与矢量数据混在一起,将增加 Flash Player(有时还有计算机)需要处理的工作量。 将表面组合在一起;例如,在创建窗口应用程序时。
在 Flash Player 中使用组件
使用组件框架,可以向组件添加功能,但也会潜在地将相当大的文件添加到应用程序。 组件会彼此继承。 一个组件会增加 FlashProfessional 文档的大小,但使用相同框架的后续组件不一定会增加文档大小。 向舞台添加组件时,文件大小会增加,但在某一时刻,它会保持不变,因为组件将共享类而不会加载这些类的新副本。
如果使用不共享相同框架的多个组件,则这些组件可能大幅度增加 SWF 文件的大小。 例如,XMLConnector 组件会使 SWF 文件增加 17 K,TextInput 组件会使文档增加 24 K。 如果添加 ComboBox 组件,则会增加 28K,因为该组件不属于之前任一组件的框架。 因为 XMLConnector 组件使用数据绑定,所以类将使 SWF 文件增加 6 K。 如果不额外添加其他内容,使用所有上述组件的文档大小为 77 K。 向文档添加新的组件时,请仔细考虑 SWF 文件大小。
组件必须位于父级 SWF 文件库中。 例如,应用程序的库中必须具有它所使用的组件的副本,即使这些组件仅是运行时加载的子级 SWF 文件所必需的。 这会确保组件正常运行,并会稍微增加父级 SWF 文件的下载时间。 但是,不会在加载到父级的 SWF 文件中继承或共享父级库。 每个子级 SWF 文件必须下载到具有相同组件副本的应用程序。
要计划发布具有向后兼容性的 SWF 文件时,必须了解哪些组件具有该功能。 下表提供关于不同版本 Flash Player 中组件可用性的信息:
组件
Flash Player 6 (6.0.65.0) 及更早版本
Flash Player 6 (6.0.65.0)
Flash Player 7 和 8
Flash Player 9
ActionScript 3.0
不支持
不支持
不支持
支持
ActionScript 2.0
支持
支持
支持
支持
V2 UI 组件集
不支持
支持
支持
支持
媒体组件
不支持
不支持
支持
支持
数据组件
不支持
不支持
支持
支持
在“发布设置”中取消选中“针对 Flash Player 6r65 优化”选项,V2 UI 组件才能运行。
优化组件样式和性能
使用 ActionScript 2.0 时,组件框架中最消耗处理器资源的调用之一为 setStyle 调用。 setStyle 调用能有效执行,但由于其实现方式,此调用将消耗大量资源。 setStyle 调用并非在所有应用程序中都是必需的,但如果要使用此调用,请考虑其性能影响。
若要增强性能,在对样式进行加载、计算并应用到 SWF 文件中的对象之前,可以更改这些样式。 如果可以在加载和计算样式之前更改这些样式,则不必调用 setStyle。
若要在使用样式时提高性能,请在实例化对象时设置每个对象的属性。 将实例动态附加到舞台时,在对 createClassObject() 的调用中设置 initObj 的属性,如以下 ActionScript 所示:
createClassObject(ComponentClass, "myInstance", 0, {styleName:"myStyle", color:0x99CCFF});
对于直接放置在舞台上的实例,可以对每个实例使用 onClipEvent(),或者也可以使用子类(建议)。 有关子类的信息,请参阅学习使用 Adobe Flash 中的 ActionScript 2.0 中的“关于编写子类”。
如果必须更改组件的样式,则可以使用 Loader 组件来提高应用程序的效率。 若要在不同组件中实现多种样式,请将每个组件放置在其各自的 SWF 文件中。 如果更改 Loader 组件的样式并重新加载 SWF 文件,将重新创建 SWF 文件中的组件。 重新创建组件后,将清空样式缓存,并重置和再次引用组件的样式。
注: 若要将一种样式应用到 SWF 文件中某组件的所有实例,请使用 _global.styles.ComponentName。
使用运行时共享库
有时可以使用运行时共享库来缩短下载时间。 对于较大的应用程序或当某站点上的许多应用程序使用相同的组件或元件时,这些库通常是必需的。 通过外部化 SWF 文件的共用资源,将不用重复下载类。 使用共享库的第一个 SWF 文件的下载时间较长,因为需要加载 SWF 文件和库。 库将在用户的计算机上缓存,所有后续 SWF 文件将使用该库。 对于一些较大的应用程序,这一过程可以大大缩短下载时间。
显示特殊字符
计算机操作系统中包含具有地区性的特定代码页。 例如,位于日本的计算机和位于英国的计算机具有不同的代码页。 Flash Player 5 及更早版本依靠代码页显示文本;Flash Player 6 及更高版本使用 Unicode 显示文本。 采用 Unicode 显示文本更加可靠且更符合标准,因为它是包含所有语言的字符的通用字符集。 大多数当前应用程序都使用 Unicode。
可以在 Flash Player 6 及更高版本中使用 Unicode 转义序列显示特殊字符。 但是,如果您不加载 UTF?8 或 UTF?16 编码的 (Unicode) 文本,或者如果您不使用 Unicode 转义序列显示特殊字符,则并不是所有字符都能正确显示。 有关 Unicode 代码图表集,请参阅 Unicode Web 站点 Unicode.org。 有关常用转义序列的列表,请参阅本节接下来部分中的表格。
非 Unicode 应用程序使用操作系统的代码页在页面上呈现字符。 在这种情况下,代码页指定您看到的字符,所以仅当用户操作系统上的代码页与应用程序的代码页匹配时,字符才会正确显示。 用于创建 SWF 文件的代码页需要与最终用户计算机上的代码页匹配。 对国际用户可能使用的应用程序使用代码页并不是一个好方法,在这种情况下,应改用 Unicode。
在代码中使用 System.useCodepage 会强制 SWF 文件使用系统的代码页而不是 Unicode。
仅当您要从外部位置加载非 Unicode 编码的文本并且该文本是使用与用户计算机上相同的代码页进行编码时,才使用该过程。 如果上述两个条件都具备,文本将正确显示。 如果上述两个条件都不具备,则使用 Unicode 和 Unicode 转义序列来对文本进行格式设置。 若要使用转义序列,请在时间轴的第 1 帧上添加以下 ActionScript 2.0 代码:
this.createTextField("myText_txt", 99, 10, 10, 200, 25); myText_txt.text = "this is my text, u00A9 2004";
此 ActionScript 将创建文本字段,并将包含版权符号 (?) 的文本输入文本字段。
您可以使 SWF 文件使用操作系统的代码页,它由 useCodepage 属性控制。 当 FlashProfessional 导出 SWF 文件时,将默认导出为 Unicode 文本,并将 System.useCodepage 设置为 false。 可能会在显示特殊文本或者在国际系统上显示文本时遇到问题,这种情况下使用系统的代码页应该可以解决文本显示不正确的问题。 但是,使用 System.useCodePage 总是最后不得已才采用的办法。
若要使用系统的代码页,请在时间轴的第 1 帧上添加以下 ActionScript 2.0 代码行:
System.useCodepage = true;
重要说明:仅当用户计算机使用的字体中包含某特殊字符时,才会显示该特殊字符。 如果不确定,请将字符或字体嵌入 SWF 文件中。
下表包含了常用的 Unicode 转义序列。
字符说明
Unicode 转义序列
长破折号 (―)
u2014
注册符号 (?)
u00AE
版权符号 (?)
u00A9
商标符号 (?)
u2122
欧元符号 (?/samp>)
u20AC
反斜杠 ()
u005C
正斜杠 (/)
u002F
左大括号 ({)
u007B
右大括号 (})
u007D
小于号 (<)
u003C
大于号 (>)
u003E
星号 (*)
u002A
评论 {{userinfo.comments}}
{{child.content}}
{{question.question}}
提交