原文:http://blog.csdn.net/bbmjfpig/article/details/6294347
这篇文章写的太好了,不得不转。以下内容全部是转载。
先简洁说下前人的研究成果。
一个是Tencent的YouYee发现的fp重绘特性,即便舞台上有多于三个的显示对象需要被重绘,Flash Player 会将其中的两个或者多
个集合(根据位置来判断)在一起,然后重绘在一个大区域里面,结果是重绘区域不会超过三个。
另一个就是Adobe公司的Lee Thomason 介绍的FP的可变跑到的重绘执行周期。其中有俩方面内容
重绘的执行基础
FP的执行本身是多线程,不过没有提供给开发人员多线程开发模式,我们只要把FP当成单线程处理理解就成。在FP执行一帧的周期
里,前一部分时间用于执行代码,剩余时间用于渲染显示列表中的对象。每个执行阶段都可以根据实际需求增加执行时间来执行更
多代码或做更多的渲染工作,周期总长度也将相应增长。
可变跑道概念
Flash Player执行一帧的周期里,前一部分时间用于执行代码,剩余时间用于渲染显示列表中的对象。每个执行阶段都可以根据实际需求
增加执行时间来执行更多代码或做更多的渲染工作,而跑道的总长度也将相应增长。
在前一模型基础上发生改变的是每一阶段在一个微观周期里的样子以及他们怎样形成一帧。
AVM2是由Flash Player中一个叫做Marshal的元帅级组件所操控,Marshal负责将时间切割成Flash Player工作所依的基本时间片,在
这里我希望澄清一下Flash Player的时间片跟swf文件运行时的帧速率没有任何关系,我们将最终看到Flash Player是如何将这些时间片
合成为一帧。在Mac OS版Firefox中执行一个由Flex编译得来的swf文件,Marshal通常会将时间切割成19-20毫秒的时间片,时间片大小
根据平台和浏览器的不同而存在差异.为方便我们接下来的讨论,我们假定时间片大小为20毫秒,也就是说Marshal每秒钟会产生不超过50个
时间片,每个时间片中,五步可能的操作按如下顺序执行:
- Player事件调度 – 比如Timer事件,鼠标事件,ENTER_FRAME事件,URLLoader事件等等。
- 用户代码执行 – 所有侦听上一步相应事件的代码被执行。
- RENDER事件调度 – 在用户代码执行期间调用stage.invalidate()会触发这一特殊事件。
- 最后的用户代码执行 – 侦听上述第三步特殊事件的用户代码此时被执行。
- Player更改显示列表。
Marshal如此反复的执行20毫秒时间片并在运行中决定下一步操作。一个时间片中执行的所有这些操作最终归纳为上述两段式跑道(代码
执行,图像渲染)也就是我们所说的一帧。用户代码和失效操作填充在代码执行区,渲染操作填充在跑道的渲染区段。需要指出的是相关操
作只能在Marshal预定的时间内发生,如果你的用户代码很短,那么Marshal仍然会在执行完用户代码后等待一段时间然后进入渲染阶段。
不同的帧速率下,一个帧周期中的可变跑道会执行不同操作,例如对于5fps的swf,每帧处理10个用户action,1个失效action,1个渲
染action;帧速率25fps的swf,每帧处理2个用户action,1个失效action,1个渲染action;对于50fps的swf,每帧只能处理1个用
户action,1个失效action,1个渲染action。需要指出的很重要的一点是,某些事件只可能能发生在某些特定的时间片里,比如,Event.ENTER_FRAME事件只能在某一帧的初始时间片中被调度。
- 一个时间片中代码部分和渲染部分都有可能过长而导致相应时间片大于20毫秒,这就是”可变”的含义,为了保证帧的播放速率仍然接近swf编译时设定的帧率,Marshal会选择丢掉一些时间片。
- swf文件的播放速率不可能超过当前Flash Player切割时间片的速率,你可以为swf文件设定120fps的播放速率,但Flash最多可以按照50帧的速度播放(具体数值取决于当前系统的设置)。
- 代码的执行频率可能比swf的帧率更高,播放一个1fps的swf文件,播放一帧时间为1秒,也就是50个时间片,但在每个时间片里,都会有触发鼠标或计时器事件,尽管只有最后一个时间片才会渲染,另外你可以选择通过调用函数updateAfterEvent() 提前渲染,但只能在鼠标,计时器和键盘事件处理函数中调用。在这种情况下,Marshal会认为当前帧已结束并从下一个时间片起进入下一帧。 最后,如果一个Sprite的外观属性比如width,height等发生变化而将鼠标从该Sprite上方掠过,Flash会进行强制渲染。
- 如果帧率不是每秒时间片数量的整数因子,那么该平台的渲染时间间隔将变得不固定,比如帧率20fps的swf运行在50个时间片每秒的系统上,Flash Player的行为将是每5个时间片播放两帧,那swf的渲染频率将是2-3-2-3-2-3(时间片)。
好了,稍微了解了重绘机制后,在写程序时可以避免一些不必要的重绘。
1、显示列表中的所有显示对象的根都是舞台stage,所以当这些显示对象的形态属性发生变化时, 会引发重绘,包括width,height
,scale,alpha等,所以这就是tween等类做UI的缓动效果时,重绘频繁,导致了CPU占用偏高。
2、当显示对象的层级发生变化时也会引发重绘,例如,在做RPG时,要时刻检测角色的层级,从而更正相互的遮挡状态,在设置层级
时最好判断下再做变化,因为即使层级没变,但调用了setChildIndex方法,也会重绘。
当用removeChild和addChild时会引发重绘。
3、在stage显示窗外外的元素不会重绘,这是FP本身实现的,之前有很多人在研究针对flash的卡马轴的算法,我认为没必要了,FP已经
实现了这功能,另外我敲了两个位图滚动的粒子对比了一下,貌似卡马轴算法的例子占CPU还会稍多一些,有时间的话还不如研究下
位图的高速存取实用些。
另外值得一提的是,我试了试,如果一个显示元素被遮挡的话,在符合重绘条件时仍会重绘,所以跟遮挡无关。这跟Tencent Team的
测试冲突,我想是因为当被遮挡住的话,重绘的边框也被遮挡住了,所以认为被遮挡的元素不会重绘,这个大家可以敲个例子试一试,
也有可能是我的例子有一定特殊性。
4、对于设置了cacheAsBitmap = true 的元素,由于元素整体被缓存成了位图,当元素有变化时,缓存的位图也会变化,所以会引起
元素的重绘,所以对于大小变形经常变化的显示元素最好不要用缓存位图,而且占内存。
5、对于设置了buttonMode 为true的显示元素,无论鼠标点击、经过、弹起等皮肤有没有,都会引发重绘。
说了减少重绘的注意方面,再来说说必要时引发重绘,MouseEvent和TimeEvent的事件有updateAfterEvent()方法,可以即刻强制
FP重绘,举例:当游戏使用自定义鼠标样式时,如果游戏帧频较低,又不想单独为了鼠标样式的流畅而提高帧频,可以在每次改变鼠标
样式(bitmap、mc等)的位置后即可强制重绘,从而使用户感觉游戏运行流畅。
分享到:
相关推荐
如减少不必要的重绘,使用缓存AsBitmap,以及利用位图遮罩等技术。 8. **兼容性和浏览器支持**:尽管Stage3D提供了强大的3D功能,但需要注意的是,它仅适用于支持Flash Player的平台,随着HTML5的发展,Flash的使用...
布局:布局的合理安排可以减少不必要的组件重绘,从而降低内存消耗。开发者应该优化布局,减少组件数量和层级深度。 AIR相关问题:Adobe AIR应用程序在运行时可能会遇到一些特有的内存问题,比如本地共享对象(LSO...
在VC++环境中集成Flash技术时,...总的来说,解决VC++中Flash重影问题需要综合考虑Flash内容、渲染机制以及VC++的编程实践。通过深入理解问题的根源并采用适当的优化策略,可以有效地实现透明且无闪烁的Flash显示效果。
2. 图形优化:减少不必要的图形重绘,使用位图缓存,合并图形操作,可以降低渲染成本。 3. 优化矢量图形:对于复杂的矢量图形,考虑转换为位图,以减轻Flash Player的渲染负担。 四、内存管理 1. 对象生命周期管理...
- **针对CPU使用量的FlashPlayer10.1增强功能**:介绍了在FlashPlayer10.1中引入的新特性,如睡眠模式、冻结和解冻对象等,用于降低CPU使用率。 - **事件模型与回调**:合理设计事件模型,避免不必要的回调,可以...
6. **使用硬件加速**:Flash Player支持硬件加速,通过开启Stage3D可以利用GPU进行渲染,显著提升复杂场景的性能。 7. **减少影片剪辑嵌套**:过多的嵌套影片剪辑会导致性能下降。考虑合并或使用单一影片剪辑,或者...
开发者可以定义JavaScript函数来调用Flash内部的方法,传递数据并触发图表的重绘。 在压缩包中的"js+flash曲线图"文件可能包含以下内容:JavaScript库、Flash图表组件的SWF文件、以及示例代码。JavaScript库可能...
例如,避免不必要的重绘、使用位图缓存以及合理地组织和更新显示列表,都能显著提高应用的运行效率。 通过深入研究“Flash魔方”,不仅可以提升对Flash编程的理解,还能掌握3D图形处理和交互设计的基本技巧。无论是...
7. **优化技巧**: 为了提高性能,开发者可能会采用缓存AsBitmap或CacheAsBitmap属性,将复杂对象转换为位图,减少重绘开销。同时,可能有预加载策略来优化图片加载速度。 8. **用户体验**: 代码可能包含了反馈机制...
9. **优化技巧**:由于Flash在处理大量3D图形时可能会面临性能挑战,因此了解如何优化代码、减少重绘次数、合理使用缓存等技巧对提高应用性能非常重要。 10. **用户体验设计**:一个好的三维地球应用不仅要有强大的...
- 为了保证游戏流畅运行,需要优化代码,避免不必要的计算和重绘。例如,只更新移动的蛇部分,而不是整个舞台。 通过分析和理解这个"Flash 3.0 贪吃蛇"小游戏,初学者不仅可以学习到AS 3.0的基础知识,还能了解到...
- **重绘区域**: 打开显示重绘区域的功能可以帮助识别哪些区域正在频繁重绘,进而定位性能瓶颈。 **2、选择适合你的游戏渲染引擎** - **渲染引擎**: 根据游戏的具体需求选择最合适的渲染引擎。 **3、尽可能避免...
接着,你需要利用Flex的渲染机制,将组件在内存中的表示转换为位图数据。 以下是一个大致的流程来实现这个功能: 1. **获取组件的渲染位图**:在Flex中,可以使用`flash.display.BitmapData`类的`draw()`方法来...
如果源码使用了DisplayObject的cacheAsBitmap属性,那么在动画运行过程中,只有首次绘制时会消耗计算资源,后续的动画帧只需要简单地重新定位和绘制缓存的位图,从而减少重绘次数。 为了实现7种颜色的线条动画,...
使用位图缓存可以提高复杂形状和文本的绘制速度,尤其是在需要频繁重绘的场景。另外,避免在帧率高的动画中进行大量的计算,可以将计算过程分解到多个帧中,以减轻每帧的压力。 事件处理的优化也不容忽视。过多的...
这涉及优化重绘区域、使用位图缓存、调整影片品质、利用GPU加速等功能。 - **优化网络交互**:减少不必要的网络操作可以显著提升性能。这包括对外部内容的有效加载、错误处理、以及合理使用Flash Remoting等。 - **...
2.2 图形缓存:对于复杂的矢量图形,使用图形缓存可以减少重绘次数,提高性能。将不常改变的元素转化为位图,可以显著减少CPU负担。 三、内存管理 3.1 对象池技术:通过对象池管理频繁创建和销毁的对象,可以减少...
- **性能优化技巧**:书中还分享了一些性能优化的技巧,例如如何合理分配内存、避免不必要的重绘等。 **3. AGAL (Adobe Graphics Assembly Language) 的应用** 除了AS3之外,本书还提到了AGAL的应用。AGAL是一种...
7. **性能优化**:为了提高用户体验,避免不必要的重绘和回流,可以使用`requestAnimationFrame`来优化动画性能,确保在浏览器渲染下一帧之前执行动画更新。 8. **兼容性检查**:虽然现代浏览器普遍支持CSS3和...