`
vanadiumlin
  • 浏览: 504917 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

深入理解Flash Player重绘

 
阅读更多

http://edu.gamfe.com/tutor/d/10659.html

http://edu.gamfe.com/tutor/d/17236.html

Flash Player 会以SWF内容的帧频速度来刷新需要变化的内容,而这个刷新的过程,我们通常称为“重绘(redraw)”,相信即便是初级的菜鸟也知道,只要使用的是Debug版本的Flash Player, 右键菜单里就会有“Show Redraw Regions (显示重绘区域)” 这个选项,当此选项打开的时候,我们就能清楚地看到此刻场景内被重绘的区域。



那么什么情况下会发生重绘呢?
1、最常见的是情况就是舞台上的可视组件在形状、位置、状态(alpha, scale...)发生改变的时候会触发Flash Player 的重绘。
2、当一个DisplayObject的层级(ChildIndex)发生改变的时候也会导致重绘。
3、当你将一个Sprite / MovieClip 的buttonMode 设置为 true 的时候,即便是单帧动画,重绘会在MouseEvent.MOUSE_DOWN的时候触发。又或者你对DisplayObject设置层级的时候,即便DisplayObject的层级没有发生改变,也会使得 Flash Player对此显示对象进行重绘。
既然重绘是为了能够将显示内容进行更新,那么一个Flash应用程序就不可避免的要触发重绘。而重绘却是性能消耗的主要根源,一个有经验的Flash开发人员写出的Flash应用,其性能可能70% - 90%(甚至更高)是消耗在重绘上,那么提高Flash应用程序的运行效率和减少重绘有着莫大的关系。
要减少重绘,首先我们需要对单位每帧重绘大小这个概念进行量化:重绘的大小应该取决于数量和面积。数量取决(但不是完全取决)于可视范围内的需要更新的显示对象的数量,假设场景上有两个闪烁的小圆点并且宽和高都为20,那么重绘的数量为3,而重绘的总面积就为: 20 * 20 * 3 = 1200 (平方像素)。



简单的看看上面的公式是不是觉得重绘面积的计算很容易呢?那么继续估计下下面这个情况的重绘面积是多少:



如果你计算的结果是: 20 * 20 * 6 = 2400 (平方像素),那么恭喜你,答错了...
根据上面的介绍,重绘的大小理应就是重绘的数量 * 单个区域的面积,可是为什么说这个情况就错呢?让我们看看问题究竟出在什么地方:



让人觉得奇怪的地方出现了,重绘区域的数量依旧是3,而面积却增大了不少,按照图上给出的坐标信息,我们不难算出,总重绘面积的大小为:
20 * (70 - 20 + 20) * 3 = 4200 (平方像素),比起预先估算的 2400 (平方像素)整整大了 75%!
或许从这个地方开始,大家就开始觉得困惑了。的确,Flash Player的重绘面积并没有按照我们之前的设想那样来计算,但是依旧能找到一些规律,仔细来看以下几种况:



如果你够细心,应该不难看出每次 Flash Player 重绘的区域不会超过3个,即便舞台上有多于三个的显示对象需要被重绘,Flash Player 会将其中的两个或者多个集合(根据位置来判断)在一起,然后重绘在一个大区域里面,至此,我们暂时可以将上面两个重绘法则命名为三区域法则就近合并法则,通过总结出来的这两个法则,我们就能更加容易地理解Flash Player 重绘的机制,以及解释在日常调试中遇到的一些重绘现象了。比如QQ牧场里几个靠得比较近得小动物被放在一个区域里面重绘,而有些动物则不然,被单独重绘。
当我们了解了重绘机制后,那么接下来就应该进一步去了解如何避免多余的重绘,下面列举的方法可能大部分都是被大家所熟悉的。
1、当一个带有动画效果的DisplayObject在不显示的时候,不仅仅是将其 visible 属性设置为 false, 因为重绘依旧会进行,这里你可以选择暂停掉动画,又或者利用removeChild(displayObject) 直接将此对象移除出显示列表。
2、不出现在可视范围内外观变化的显示对象其实是不会发生重绘的,这点相信是Flash本身做了优化,也就是说我的Stage.stageWidth 和 Stage.stageHeight 都为200的情况下,一个处在舞台上的变化的显示物体,坐标为(200, 200) 宽高都为10,此时Flash Player重绘内容并不会包括此对象,新版本的Flash Player 甚至在浏览器窗口最小化的时候会关闭掉所有的重绘,这个时候你往往会发现CPU占用率骤降,但是应用程序依旧在运行。
3、在设置DisplayObject的层级的时候请先做一个判断:

if (myContainer.getChildIndex(myChild) != 0) 
{ 
    myContainer.setChildIndex(myChild, 0); 
}

运气好的话,这个判断最高能带来200%以上的效率提升。
4、当你的Sprite / MovieClip 设置 cacheAsBitmap = true 这个属性的时候,当此显示对象内很小的一个区域(甚至是被遮盖着的物体)发生变化,会导致整个Sprite / MovieClip重绘。
5、尽量确保活动的显示内容在非可见区域被暂停活动或者干脆直接移除出显示列表,这里提到的不可视区域不仅仅是舞台外不可见的,还包括舞台内被其他物体遮盖住的显示对象。

正如之前提到的,重绘是Flash Player性能消耗的主要大户,所以去优化减小重绘区域面积,减少不必要的重绘操作次数,往往能够带来比较大的性能优化回报。

分享到:
评论

相关推荐

    C++flash透明源码

    在IT领域,C++是一种强大的、面向对象的编程...通过阅读和理解这些源码,你可以深入学习如何在C++中集成和控制Flash,以及如何实现透明效果。这对于想要将Flash内容嵌入到桌面应用中的开发者来说,是一份宝贵的资源。

    vc播放flash(支持透明flash窗口穿透)

    在本文中,我们将深入探讨如何使用VC++ 2010来...通过对提供的源代码进行分析和理解,开发者可以学习到Windows GUI编程中的许多实用技巧和概念,这对于任何希望深入了解Windows应用程序开发的人来说都是宝贵的资源。

    FLASH 3D 旋转代码

    如减少不必要的重绘,使用缓存AsBitmap,以及利用位图遮罩等技术。 8. **兼容性和浏览器支持**:尽管Stage3D提供了强大的3D功能,但需要注意的是,它仅适用于支持Flash Player的平台,随着HTML5的发展,Flash的使用...

    flash图表组件

    开发者可以定义JavaScript函数来调用Flash内部的方法,传递数据并触发图表的重绘。 在压缩包中的"js+flash曲线图"文件可能包含以下内容:JavaScript库、Flash图表组件的SWF文件、以及示例代码。JavaScript库可能...

    优化Flash性能 Optimizing Flash performance

    使用`cacheAsBitmap`属性可以缓存复杂的矢量图形,减少不必要的重绘。同时,利用位图遮罩(bitmap masking)代替矢量遮罩也能提高性能。 3. **代码优化**:编写高效的动作脚本代码至关重要。避免使用循环内的函数...

    VC++ flash 解决重影问题,透明现实

    在VC++环境中集成Flash技术时,开发者可能会遇到一个常见的视觉问题——重影或者闪烁现象,尤其是在涉及透明效果时。...通过深入理解问题的根源并采用适当的优化策略,可以有效地实现透明且无闪烁的Flash显示效果。

    Flash平台技术的优化 (中文PDF)

    在深入优化之前,了解Flash的基础至关重要。Flash平台包括ActionScript编程语言、Flash Player以及Flash Professional等开发工具。ActionScript是用于控制动画和交互的核心语言,而Flash Player则是运行这些内容的...

    三维地球Flash源文件

    9. **优化技巧**:由于Flash在处理大量3D图形时可能会面临性能挑战,因此了解如何优化代码、减少重绘次数、合理使用缓存等技巧对提高应用性能非常重要。 10. **用户体验设计**:一个好的三维地球应用不仅要有强大的...

    Flash 魔方.zip

    本篇文章将聚焦于“Flash魔方”这一主题,通过分析其核心技术和实现方式,帮助读者深入理解Flash在3D旋转动画和程序控制上的技术魅力。 首先,我们要了解“Flash魔方”是一个基于Flash平台的互动应用,它利用了...

    Flash-性能优化

    - **针对CPU使用量的FlashPlayer10.1增强功能**:介绍了在FlashPlayer10.1中引入的新特性,如睡眠模式、冻结和解冻对象等,用于降低CPU使用率。 - **事件模型与回调**:合理设计事件模型,避免不必要的回调,可以...

    wavewarp_flash源码_源码

    如果源码使用了DisplayObject的cacheAsBitmap属性,那么在动画运行过程中,只有首次绘制时会消耗计算资源,后续的动画帧只需要简单地重新定位和绘制缓存的位图,从而减少重绘次数。 为了实现7种颜色的线条动画,...

    围住神经猫flash版源代码

    《围住神经猫》是一款...通过学习和分析《围住神经猫》的源代码,开发者不仅能深入理解AS3语言和Flash编程,还能掌握游戏开发的关键技术和设计思路。无论是对于初学者还是有经验的开发者,这都是一个宝贵的实践案例。

    Flash开发性能优化宝典

    在Adobe Flash平台上开发应用时,性能优化是提升用户体验的关键因素。Flash因其强大的交互性和跨平台能力,...通过深入理解这些知识点,并在实践中灵活运用,可以显著提升Flash应用的性能,为用户提供更加流畅的体验。

    flash as3.0的涂鸦板

    6. **优化性能**:在处理大量绘图操作时,为了提高性能,可以使用`stage`的`cacheAsBitmap`属性,将其设置为`true`,以缓存舞台的位图表示,减少重绘次数。 7. **交互设计**:除了基本的绘画和清除功能,还可以增加...

    thumbnailsgrid_flash源码_

    7. **优化技巧**: 为了提高性能,开发者可能会采用缓存AsBitmap或CacheAsBitmap属性,将复杂对象转换为位图,减少重绘开销。同时,可能有预加载策略来优化图片加载速度。 8. **用户体验**: 代码可能包含了反馈机制...

    flash 3.0美女来找茬:小游戏

    下面我们将深入探讨该游戏涉及的Flash AS 3.0知识点: 1. **ActionScript 3.0基础**: - AS 3.0是Flash平台的核心编程语言,它与之前的版本相比,具有更严格的类型检查、更高的执行效率和更好的面向对象特性。 - ...

    player(AS3)

    在实际应用中,需要考虑内存管理、减少不必要的计算和重绘,以及确保播放器在不同网络环境下的流畅运行。 综上所述,“player(AS3)”是一个AS3初学者的实践项目,展示了如何使用AS3的基本元素构建一个功能齐全的...

    flash编程优化

    2.2 图形缓存:对于复杂的矢量图形,使用图形缓存可以减少重绘次数,提高性能。将不常改变的元素转化为位图,可以显著减少CPU负担。 三、内存管理 3.1 对象池技术:通过对象池管理频繁创建和销毁的对象,可以减少...

    从零开始学习Flash AS3游戏开发.PDF

    - **管理游戏循环**:负责更新游戏状态并重绘画面。 --- ### 四、编程实践 #### 4.1 创建基本游戏对象 - **步骤**: 1. **创建项目**:使用FlashDevelop新建一个项目。 2. **定义`Main`类**:继承自`Sprite`...

    flash贪吃蛇论文及代码

    1. 剪辑管理:为了提高性能,可以使用`MovieClip`对象对游戏区域进行剪辑,只重绘必要的部分。 2. 难度设置:增加速度选择,调整食物生成频率等,增加游戏可玩性。 3. 高分榜:实现本地或网络高分榜,增加玩家的挑战...

Global site tag (gtag.js) - Google Analytics