[as3][翻译]缓存display对象
[注]本文主要包括:介绍缓存的优点、启用和不应该启用缓存的几种情况、如何启用缓存、设置不透明背景来优化性能
不管是创建一个应用程序还是一个复杂的脚本动画,随着Flash文件的增大,你需要考虑考虑下性能和优化。如果内容是静态的(比如一个矩形),Flash不会优化它。因此,当你改变这个矩形的位置的时候,Flash会重绘整个Shape实例。
可以通过缓存一些display对象来提高SWF文件的性能。display对象的面具(注:原文并不是这个意思,这是我按照自己的理解写的。原文是表面、外表的意思),本质上是这个对象的矢量数据构成的位图,在SWF文件中,一般不用改变矢量数据的值。因此,如果缓存了实例,在SWF文件播放的过程中就不用频繁的重绘它,从而使SWF文件呈现的更快。
注意
可以更新矢量数据,这时面具将被重新创建。也就是说面具的这些矢量数据不需要在整个SWF文件中保持一致。
把display对象的cacheBitmap属性设为true将使该对象缓存一个自身的位图。Flash会为这个display实例创建一个缓存的面具对象,而不是矢量数据。当你改变这个display对象的范围的时候,面具将会被重建而不是仅仅改变大小。面具中还可以嵌套其他面具。子面具会把它自己的位图拷贝到父面具上。
DisplayObject类的opaqueBackground属性和scrollRect属性都跟cacheAsBitmap属性有关。尽管这三个属性相互独立,但是当display对象缓存成位图的时候opaqueBackground和scrollRect效果会更好——只有当把cacheAsBitmap设置为true的时候才能看到它对opaqueBackground和scrollRect性能提高的作用。
什么时候启用缓存
对display对象启用缓存会创建一个面具,它有很多优点,比如可以使复杂的矢量动画呈现的更快。有几种情况可以启用缓存。或许你想总是启用缓存来调高SWF文件的性能,但是有些情况下启用缓存并不会提高性能,甚至还会降低性能。下面将介绍什么情况下应该使用缓存,什么时候使用常规的display对象。
缓存数据方法的总体性能取决于实例对象的矢量数据的复杂度、将会改变的数据量以及是否设置opaqueBackground属性。如果只改变一小范围的数据,那么使用面具和使用矢量数据差别不大。在开发程序前你可以测试比较下两种情况。
启用缓存的情况
下面几种情况下如果启用了缓存将会大大受益。
- 复杂的背景图片:包含详细、复杂矢量数据背景图片的应用程序(可能是应用了跟踪位图命令的图像,也可能是在 Adobe Illustrator 中创建的图片)。你可能会在背景上创建动画,这样会减慢动画,因为背景需要持续的重新生成矢量数据。为了提高性能,你可以把背景对象的opaqueBackground属性设为true。这样背景就会被当作位图,重绘的会更快,从而使动画播放的更快。
- 滚动文本:在滚动文本框中显示大量文字的应用程序。可以把文本框放到一个display对象中,然后把display对象设置成可滚动的(设置scrollRect属性)。这样可使特定的实例快速的像素滚动。当用户滚动display对象实例时,Flash把滚动过的像素向上移动,并生成新的显示区域而不是重新生成整个文本。
- 具有重叠窗口复杂系统的应用程序。每个窗口都可以打开和关闭(比如,web浏览器窗口)。如果把每个窗口标记为一个面具(设置cacheBitmap属性为true),每个窗口被隔离开并被缓存。用户可以拖动窗口这样它们将相互重叠,并且每个窗口不需要重新生成它的矢量内容。
- Alpha通道遮罩:当使用alpha通道遮罩的时候,必须把cacheAsBitmap属性设为true。
在上面这些情况中启用缓存将优化矢量图形,从而提高程序的响应速度和可交互性。
另外,当对display对象应用滤镜的时候,就算你明确的把cacheAsBitmap设置为false了,Flash Player也会自动把它设置为true。当你从display对象清除了所有滤镜后,cacheAsBitmap会恢复成最近一次被设置的值(当然不包括FlashPlayer设的)。
不应该启用缓存的情况
滥用此功能会对SWF文件造成负面效果。当使用缓存的时候记住下面这些原则:
- 不要过度使用面具(启用了缓存的display对象)。每个面具都比常规的display对象占用更多的内存,也就是说只有当你需要提高呈现速度的时候才启用缓存。
缓存的位图比常规的display对象使用多的多的内存。比如舞台上一个250像素×250像素的Sprite实例,缓存它大概需要250KB,而不缓存的时候只需要1KB。 - 不要放大缓存的面具。如果滥用缓存,将消耗大量内存(查看前一条),特别是放大它的内容的时候。
- 对近似静态(非动画)的display对象使用缓存。你可以拖动或者移动它,但是它的内容不应该动起来或者改变的太多。(有动作或改变内容就像一个包含动画或Video实例的MovieClip。)比如,如果旋转或转换一个实例,这个实例将在面具和矢量数据之间转换,这样将增加处理的难度并且对SWF文件产生负面影响。
- 如果把面具和矢量数据混合使用,将增加FlashPlayer需要处理的工作量。尽可能的将面具归为一组——比如,当创建窗口程序的时候。
启用缓存
如果要对某个display对象启用缓存,就把它的cacheAsBitmap属性设为true:
- mySprite.cacheAsBitmap = true;
当把cacheAsBitmap属性设为true后,你或许就会感觉到diplay对象会自动紧贴整个坐标像素。当测试SWF文件时,应该会感觉到任何复杂的动画都会更快的呈现出来。
就算cacheAsBitmap设为了true,当下面情况之一发生的时候,面具(缓存的位图)不会被创建:
- 位图的图像高度或宽度超过了2880像素。
- 没有足够的内存分配给位图
设置一个不透明的背景颜色
你可以为一个display对象设置一个不透明的背景。比如,如果SWF文件有一个包含复杂矢量图片的背景,你就可以把opaqueBackground属性设为一个特殊的颜色(比如正好和舞台颜色一样)。颜色由一个数字来指定(一般是十六进制颜色值)。这样背景就被处理为位图,从而优化了性能。
如果把cacheAsBitmap设为true,opaqueBackground也指定了颜色,那么opaqueBackground属性将允许内部位图不透明并呈现的更快。如果没把cacheAsBitmap设为true,opaqueBackground属性会为这个display对象添的背景加一个不透明的矢量方形。它不会自动创建一个位图。
下面的代码展示了任何为一个display对象设置背景来优化性能:
- myShape.cacheAsBitmap = true;
- myShape.opaqueBackground = 0xFF0000;
在这个例子中,myShape的背景颜色被设置成了红色(0xFF0000)。假设这个图形中包含一个绿色的三角形,而舞台的背景是白色,那么这个图形会显示一个绿色的三角形而在它范围内的其他地方显示红色。

当然,如果在一个纯红的舞台上这段代码会更有意义。在其他颜色的背景上,应该设成其他颜色。比如,在白色背景的SWF中,opaqueBackground最好设成0xFFFFFF,也就是纯白色。

Leave a Reply