降低显示列表上的复杂性来提高性能

增加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工具 。 所做的工作是创建一个快速测试,然后添加方法到
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显示对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要提高在 Ubuntu 系统上的 WebGL 速度,你可以尝试以下几种方法: 1. 更新显卡驱动:确保你的显卡驱动是最新版本,这可以提高 WebGL 的性能。 2. 关闭其他程序:当你在使用 WebGL 时,关闭其他不必要的程序以获得更多的系统资源。 3. 使用更快的浏览器:不同的浏览器对 WebGL 的支持程度不同,选择更快的浏览器,可以提高 WebGL 的速度。 4. 减少 WebGL 场景的复杂度:减少场景中的物体数量和复杂的运算,可以提高 WebGL 的速度。 5. 优化代码:对 WebGL 代码进行优化,以减少不必要的计算和提高性能。 这些方法都可以帮助你提高在 Ubuntu 系统上的 WebGL 速度。 ### 回答2: 要在Ubuntu系统上提高WebGL的速度,您可以采取以下几个步骤: 1. 更新显卡驱动程序:您可以通过更新显卡驱动程序来获得更好的性能。在Ubuntu系统中,可以使用命令行或软件包管理器工具来更新驱动程序。 2. 禁用页面合成:在Chrome浏览器中,您可以禁用页面合成功能以提高WebGL性能。在地址栏中输入"chrome://flags"然后搜索"快速导航、快速重绘和快速JIT",将其设置为"禁用"。 3. 关闭不必要的扩展和插件:某些扩展和插件可能会占用系统资源,降低WebGL性能。您可以在浏览器设置中禁用或移除不必要的扩展和插件。 4. 优化代码和资源:如果您是开发者,可以通过优化代码和资源来提高WebGL性能。使用合适的算法、减少负载、优化纹理和减少功耗,都能帮助提高性能。 5. 使用兼容性更好的浏览器:某些浏览器可能对WebGL的支持更好。您可以尝试使用其他浏览器,比如Firefox或Opera等,看看是否有性能提升。 6. 提高系统资源:WebGL的性能受限于处理器和内存等硬件资源。如果您的系统配置较低,那么升级硬件或将资源分配给WebGL应用程序可能会提高性能。 请记住,WebGL性能的提升取决于多个因素,并且可能因系统配置和应用程序的特定需求而有所不同。因此,您可能需要针对您的具体情况进行调整和优化。 ### 回答3: 提升在Ubuntu系统上WebGL的速度可以从以下几个方面来考虑: 1. 更新图形驱动程序:确保您的图形驱动程序为最新版本。可以通过更新软件或者从官方网站下载最新的驱动程序来实现。 2. 启用硬件加速:WebGL可以利用显卡的硬件加速功能来提高性能。可以在系统设置中查找相关选项,并确保已经启用硬件加速。 3. 优化WebGL应用程序:WebGL的性能还取决于您的应用程序的优化程度。可以通过减少复杂的绘制操作、合并绘制调用、使用纹理压缩等技术来减轻渲染负载。 4. 关闭不必要的背景任务:关闭其他占用资源的应用程序和后台任务,以便给WebGL应用程序更多的资源。 5. 调整系统设置:可以在系统设置中调整一些参数来提高WebGL的性能。例如,调整显示分辨率、调整硬件加速的设置等。 6. 使用更高性能的硬件:如果以上方法无法满足您的要求,可以考虑升级您的计算机硬件,如更换显卡或增加内存等。 请注意,优化WebGL的性能是一个复杂的过程,需要不断的试验和调整。上述方法仅作为一般指导,具体情况可能需要根据您的系统和应用程序的特定要求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值