博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
降低显示列表上的复杂性来提高性能
阅读量:4105 次
发布时间:2019-05-25

本文共 4164 字,大约阅读时间需要 13 分钟。

增加Flash应用程序性能的一种最简单方法是,移除显示列表中所有的隐藏对象,同时使用最少数量的显示对象。 代码将通过遍历整个显示列表来执行,即从显示列表最上层(舞台),到主应用程序类。 Flash Player执行代码,并从上到下重绘显示列表中的所有的孩子,直到到达显示对象。 容器可以使任何继承自DisplayObjectContainer的类,如UIComponent,Group或者Sprite。
displaylisttree.png 
尤其是在MXML中,很容易就嵌套了显示对象,但是每次嵌套对象时都是非常耗性能的,因为每个添加到现实对象列表的对象都继承了一个类,这个类又继承另一个,如此等等。 为了理解为什么嵌套是高消耗的, 让我们看一下显示列表类的层次结构。
display_list.png 
AS3
当谈到显示列表,对于AS3来说,所有的显示对象过去曾经是MovieClip。 在Flash Pro中早期的Flash版本(AS1和AS2)中,MovieClip类都是动画的核心类。 每一个MovieClip符号包含了显示对象的行为和功能,以及操作时间轴的附加属性。 许多时候你并不需要多余的图层以及时间轴的开销,而事实上AS3提供了一种能的对象叫做DisplayObject。 DisplayObject是低层的为那些能够被添加到显示列表的所有对象的基类,它继承了EventDispatcher(它是基于对象的)。 它包括一些类来帮助管理对象(如cacheASBitmap)和可视属性。 显示对象容器是一种这样的对象,在它们里面可以包含子对象(这些子对象是显示对象)。 DisplayObjectContainer包含了一些方法,来管理它们的孩子对象,例如AddChild(向容器中添加对象),numChildren(容器所包含的孩子对象的个数)和removeChild(移除子对象)。
有些时候,你需要显示图形但又不需要时间轴。 这时你需要使用Sprite,它继承自DisplayObjectContainer类。 一般原则,你最好使用Bitmap,Shape和Sprite类或者它们的子类,而不要选择MovieClip。
Flex3
下面是最小化的Flex。 Flex对于显示对象的核心类是FlexSprite,除了能够返回一个字符串表示这个对象的位置外,和Sprite没什么两样。 接下来是UIComponent,它继承了FlexSprite,也是Flex3中每个可视组件的基类。 UIComponent包括了键盘和鼠标交互,同时也允许在不需要的时候关闭这些交互,例如label。 它也包含了许多特征,例如accessibility(可访问性),Style(样式),State(状态),Invalidation和Validation(合法性),DataBinding(数据绑定),Effect(效果),嵌入字体等等。
Flex4
下面是Flex4. Flex4使用Group作为Spark(相当于MX中的UIComponent)中可视元素的容器基类。然后你可以使用一系列的组件,如Skin,Graphic,HGroup和VGroup。
除了Group之外,也可以使用SkinnableComponent,它是所有Spark组件的超类,它为skinnable组件定义了基类。 使用SkinnableComponent类的皮肤是Skin类的典型子类。
以Spark按钮为例。 ButtonBase类是所有Spark按钮组件的基类。 Button和ToggleButtonBase是ButtonBase的子类。 同样,诸如CheckBox和RadioButton类是ToggleButtonBase的子类。 按钮组件继承了ButtonBase,同时使用了默认皮肤,包含了一个文本label。 你可以自定义皮肤类来添加图像到控制或其他任何你需要的东西。 默认按钮皮肤是spark.skins.spark.ButtonSkin,它继承自Skin。 最后提到的是Spark中的组件,它们很容易改变,但是也非常重要。
下面做一些测试。 关于显示对象的内存使用情况:
  1. Shape: 224 bytes
  2. Sprite: 392 bytes
  3. MovieClip: 428 bytes
  4. UIComponent: 1036 bytes
  5. Group: 1200 bytes
复制代码
下面,看一下Flash Player代码在帧上的执行时间。 建议使用“我”前几天开发的FrameStats工具。 所做的工作是创建一个快速测试,然后添加方法到
工具 它允许你查看在一帧或几帧上代码执行时间(毫秒单位)的信息。 我将把帧率设为1秒(这样测试的更清楚,也便于观察结果),然后调用一个将被添加到显示对象的方法,添加显示对象到显示列表。 然后可以在控制台里跟踪帧的生命周期。
  1. protected function creationCompleteHandler():void
  2. frameStats = new FrameStats(FlexGlobals.topLevelApplication, false );
  3. frameRateControl = new FrameRateControl( FlexGlobals.topLevelApplication, false, false, 1, 1);
  4. var componenent:UIComponent = new UIComponent();
  5. componenent.addChild( frameStats );
  6. frameStatsHolder.addElement( componenent );
  7. trace( "Sprite: " + getSize(new Group()) );
  8. uicom.addChild( sprite );
  9. frameStats.testingExecutionTimeOfMethod( methodToTest, 10000 );
  10. private function methodToTest():void
  11. sprite.addChild( new Group() );
  12. </fx:Script>
  13. <s:Group id="frameStatsHolder" />
  14. <mx:UIComponent id="uicom" />
复制代码
显示对象
当添加10000个显示对象是,对于主要基类构造器的代码执行以及子类情况如下:
  1. Shape
  2. Constructor code of children executed: 276
  3. Sprite
  4. Constructor code of children executed: 399
  5. UIComponent
  6. Constructor code of children executed: 1078
  7. Group
  8. Constructor code of children executed: 1195
复制代码
正如所料,构造器代码和每个构造器的执行在拥有较多嵌套对象时,将花费更长时间。 如果你知道Flash Player经常将构造器方法放到自身代码的概念,这是有益的,因此在构造器上的执行时间会比其他类更长,我们应该尽量减少构造函数中的代码。
添加1000个显示对象
按钮:
虽然我添加了10000个SimpleButton的显示对象,Player在帧率为1fps时也只用了33毫秒,原因是SimpleButton在显示对象树的层次上比较靠上,所以是较少的嵌套结构。 SparkButton在构造器代码上执行时间要比Halo更长,但有趣的是,SpariButton对于显示列表的渲染时间要短一些。
  1. SimpleButton
  2. Constructor code of children executed: 33
  3. Final user code executed: 730
  4. Player renders changes display list: 304
  5. mx.Button
  6. Constructor code of children executed: 820
  7. Player renders changes display list: 7075
  8. s:Button
  9. Constructor code of children executed: 2392
  10. Player renders changes display list: 4539
复制代码
Text
添加文本的结果也非常有趣。 Spark Label在渲染的时间上做的还不错,但是在构造函数的执行时间上还是不如Halo组件。 TLF在渲染上做的很差,但是构造器时间上非常好。
  1. TextField
  2. Constructor code of children executed: 68
  3. Player renders changes display list: 168
  4. mx:Text
  5. Constructor code of children executed: 743
  6. Player renders changes display list: 685
  7. S:Label
  8. Constructor code of children executed: 1136
  9. Player renders changes display list: 198
  10. s:RichText
  11. Constructor code of children executed: 416
  12. Player renders changes display list: 3224
复制代码
结论
--使用低层次(即位于结构树的靠近根的位置)的类,例如TextField,SimpleButton(如果可能的话),而不是Halo和Spark 它可能需要更多的代码,但是将提高性能。
--避免使用TLF
--使用Halo组件而不是Spark组件
--自定义组件时,Sprit > MovieClip & UIComponent > Group
--在创建矢量图形是,建议使用Shape显示对象

转载地址:http://qejsi.baihongyu.com/

你可能感兴趣的文章
《读书笔记》—–书单推荐
查看>>
【设计模式】—-(2)工厂方法模式(创建型)
查看>>
有return的情况下try catch finally的执行顺序(最有说服力的总结)
查看>>
String s1 = new String("abc"); String s2 = ("abc");
查看>>
JAVA数据类型
查看>>
Xshell 4 入门
查看>>
SoapUI-入门
查看>>
Oracle -常用命令
查看>>
JAVA技术简称
查看>>
ORACLE模糊查询优化浅谈
查看>>
2016——个人年度总结
查看>>
2017——新的开始,加油!
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.1、类和实例
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.4、获取对象信息
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
Linux设备模型(总线、设备、驱动程序和类)之四:class_register
查看>>