http://flashteam.tencent.com/post/60/深入理解flash-player重绘/comment-page-1/#comment-172
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性能消耗的主要大户,所以去优化减小重绘区域面积,减少不必要的重绘操作次数,往往能够带来比较大的性能优化回报。
分享到:
相关推荐
如减少不必要的重绘,使用缓存AsBitmap,以及利用位图遮罩等技术。 8. **兼容性和浏览器支持**:尽管Stage3D提供了强大的3D功能,但需要注意的是,它仅适用于支持Flash Player的平台,随着HTML5的发展,Flash的使用...
在IT领域,C++是一种强大的、面向对象的编程...通过阅读和理解这些源码,你可以深入学习如何在C++中集成和控制Flash,以及如何实现透明效果。这对于想要将Flash内容嵌入到桌面应用中的开发者来说,是一份宝贵的资源。
3. **RedrawWindow**:强制窗口重绘,以更新透明效果。 4. **WM_NCCALCSIZE** 和 `WM_NCHITTEST` 消息处理:确保透明区域仍能响应鼠标事件,实现穿透效果。 通过以上步骤,开发者能够创建出一个能够在透明部分穿透...
本篇文章将聚焦于“Flash魔方”这一主题,通过分析其核心技术和实现方式,帮助读者深入理解Flash在3D旋转动画和程序控制上的技术魅力。 首先,我们要了解“Flash魔方”是一个基于Flash平台的互动应用,它利用了...
开发者可以定义JavaScript函数来调用Flash内部的方法,传递数据并触发图表的重绘。 在压缩包中的"js+flash曲线图"文件可能包含以下内容:JavaScript库、Flash图表组件的SWF文件、以及示例代码。JavaScript库可能...
使用`cacheAsBitmap`属性可以缓存复杂的矢量图形,减少不必要的重绘。同时,利用位图遮罩(bitmap masking)代替矢量遮罩也能提高性能。 3. **代码优化**:编写高效的动作脚本代码至关重要。避免使用循环内的函数...
在VC++环境中集成Flash技术时,开发者可能会遇到一个常见的视觉问题——重影或者闪烁现象,尤其是在涉及透明效果时。...通过深入理解问题的根源并采用适当的优化策略,可以有效地实现透明且无闪烁的Flash显示效果。
9. **优化技巧**:由于Flash在处理大量3D图形时可能会面临性能挑战,因此了解如何优化代码、减少重绘次数、合理使用缓存等技巧对提高应用性能非常重要。 10. **用户体验设计**:一个好的三维地球应用不仅要有强大的...
7. **优化技巧**: 为了提高性能,开发者可能会采用缓存AsBitmap或CacheAsBitmap属性,将复杂对象转换为位图,减少重绘开销。同时,可能有预加载策略来优化图片加载速度。 8. **用户体验**: 代码可能包含了反馈机制...
### Flash-性能优化 在Adobe®Flash®Platform的性能优化领域,开发者们追求的是如何让他们的应用程序在多种设备...开发者应深入理解Flash运行时的基本原理,掌握上述关键知识点,才能构建出既美观又高效的Flash应用。
6. **优化性能**:在处理大量绘图操作时,为了提高性能,可以使用`stage`的`cacheAsBitmap`属性,将其设置为`true`,以缓存舞台的位图表示,减少重绘次数。 7. **交互设计**:除了基本的绘画和清除功能,还可以增加...
《围住神经猫》是一款...通过学习和分析《围住神经猫》的源代码,开发者不仅能深入理解AS3语言和Flash编程,还能掌握游戏开发的关键技术和设计思路。无论是对于初学者还是有经验的开发者,这都是一个宝贵的实践案例。
在Adobe Flash平台上开发应用时,性能优化是提升用户体验的关键因素。Flash因其强大的交互性和跨平台能力,...通过深入理解这些知识点,并在实践中灵活运用,可以显著提升Flash应用的性能,为用户提供更加流畅的体验。
如果源码使用了DisplayObject的cacheAsBitmap属性,那么在动画运行过程中,只有首次绘制时会消耗计算资源,后续的动画帧只需要简单地重新定位和绘制缓存的位图,从而减少重绘次数。 为了实现7种颜色的线条动画,...
下面我们将深入探讨该游戏涉及的Flash AS 3.0知识点: 1. **ActionScript 3.0基础**: - AS 3.0是Flash平台的核心编程语言,它与之前的版本相比,具有更严格的类型检查、更高的执行效率和更好的面向对象特性。 - ...
在Flash开发领域,AS2(ActionScript ...通过深入理解和应用这些知识点,开发者可以利用提供的"FLASH多用途滚动条AS2版本"资源,创造出符合自己需求的、具有高级功能和定制外观的滚动条,从而提升Flash内容的用户体验。
这涉及优化重绘区域、使用位图缓存、调整影片品质、利用GPU加速等功能。 - **优化网络交互**:减少不必要的网络操作可以显著提升性能。这包括对外部内容的有效加载、错误处理、以及合理使用Flash Remoting等。 - **...
2.2 图形缓存:对于复杂的矢量图形,使用图形缓存可以减少重绘次数,提高性能。将不常改变的元素转化为位图,可以显著减少CPU负担。 三、内存管理 3.1 对象池技术:通过对象池管理频繁创建和销毁的对象,可以减少...
在实际应用中,需要考虑内存管理、减少不必要的计算和重绘,以及确保播放器在不同网络环境下的流畅运行。 综上所述,“player(AS3)”是一个AS3初学者的实践项目,展示了如何使用AS3的基本元素构建一个功能齐全的...
- **管理游戏循环**:负责更新游戏状态并重绘画面。 --- ### 四、编程实践 #### 4.1 创建基本游戏对象 - **步骤**: 1. **创建项目**:使用FlashDevelop新建一个项目。 2. **定义`Main`类**:继承自`Sprite`...