论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS编程教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

render事件来提高程序的运行效率(as3.0)

文章类别:Flash AS编程 | 发表日期:2008-10-6 17:43:51


AS3中的DisplayObject有一个render事件,他会在重绘DisplayList之前触发,这给我们提供了在重绘之前最后一次操作的机会。

每次需要DisplayObject触发render事时,都要调用一次 stage.invalidate();

下面用一个小例子来说明一下具体用法把。


假设我们现在要写一个list组件,该组件有addItem()方法用于添加list项目,和remvoeItem() 方法用于删除list项目,当然还可能有addItemAt(),removeItemAt()等方法,这些方法调用后,都需要对list内的显示对象进行重新排列。


我们先实现一个List类,用于显示列表项目
List类中,有addItem() 和 removeItem() 这两个方法提供给外部调用,用于添加和删除list项目,这两个方法中除了将列表项目添加/删除,还要调用一个方法来重新对list中的项目进行排列,layoutContents()。

关键就是,这个layoutContents()的调用,他的调用次数越少,那效率当然就越高啦,如果是常规的做法,就是类似这样:
代码:
public function addItem(item:DisplayObject):void { addChild(item); layoutContents(); }

将item加入后,重新排列列表

下面是List类的源代码:
代码:
package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.Event; public class List extends Sprite { public function addItem(item:DisplayObject):void { addChild(item); layoutContents(); } public function removeItem(item:DisplayObject):void { if(contains(item)) { removeChild(item); layoutContents(); } } //对内部项目进行排列,可以是任意的排列算法 protected function layoutcontents():void { trace("do layout"); var y:Number = 0; var num:int = numChildren; for(var i:int=0; i<num; i++) { var child:DisplayObject = getChildAt(i); child.x = 0; child.y = y; y += child.height+2; } } }

这个程序粗看似乎没什么问题,但却存在一个效率问题
如果只调用一次addItem,没问题,如果调用10次呢? 前9次的layoutcontents()都不是必须的,只有第十次才是真正需要的这样程序的效率就降低了。
我们可以试一下

先需要一个简单的ListItem
代码:
package { import flash.display.Shape; public class ListItem extends Shape { public function ListItem() { super(); graphics.beginFill(0xFF6600); graphics.drawRect(0, 0, 30, 16); graphics.endFill(); } } }


然后测试
代码:
package { import flash.display.Sprite; public class ListTest extends Sprite { public function ListTest() { var list:List = new List(); addChild(list); list.addItem(new ListItem()); list.addItem(new ListItem()); list.addItem(new ListItem()); } } }


我们可以看到,输出了3次 do layout 说明layoutcontents执行了3次,前两次都是多余的。

视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058