flash as3 点滴 2008-05-27 01:24:40 / 个人分类:AS3 这几天给某网站做性能优化,发现一些值得记录下来的问题。 1.可视类的问题 可视类里面如果还存在其他已命名的可视元素,在类文件里面,是应该不声明变量的,否则会报命名重复的错误。 但可以加入static的命名,例如类的皮肤里面已有一个叫bg的Movieclip,你可以在类文件内定义static var bg:MovieClip 但是,这里要强调的但是,这里声明的static变量,并不是舞台上的这个bg,也无法被访问到(值无法使用类的静态属性访问方法)。 还有一个需要注意的地方,这个bg只能是public的,无法设成其他属性。 2.关于Event.ADDED_TO_STAGE 很多时候,可视类初始化的时候,要用到stage属性,则必须使用Event.ADDED_TO_STAGE事件,有的时候,连文档类初始化时,也需要用到Event.ADDED_TO_STAGE,原因是这个swf将被其它的文件加载,如果直接在初始化函数内使用stage属性,单独发布是没问题的,但联调时就会发生问题。 但是,文档类初始化函数内的Event.ADDED_TO_STAGE,当这个swf被其他文件加载时,很有可能被触发两次,如果你将所有真正的初始化代码都写在Event.ADDED_TO_STAGE事件相应函数内,所有的可视化元素,将会被new出来两份,所有的侦听,将会有两份... 这个现象很隐蔽,往往发生了也不报错,从表面上也看不出问题,但一旦发生,轻则降低机器性能,重则会发生很多灵异事件,例如明明把某个元素visible设成false了,但屏幕上还是能看到它,原因就是new出来东西,都将有两份。 Event.ADDED_TO_STAGE被广播两次的原因,可能是文档类的特殊性造成的,它自己初始化的时候被触发一次,被加载并显示的时候再触发一次。 3.之所以用flash来做as3,就是应为它方便做皮肤,方便集成动画,还是要合理利用flash的优势,能用笔画出来的,就不要用代码去写出来,能在舞台上搭好的,就不要在代码里面一个个的new,一个个的设xy。但是,也不要象as2时代那样,还在时间轴上写代码,要力求美术设计和业务逻辑的实现完全分离。 4.做整站,要有人做框架,定前期规划,定通信机制,尽量用规范的设计模式。尤其是数据共享、事件管理、动画效果控制、debug输出等等,最好用单例模式,否则最后联调会有很多麻烦。 确保Object的回收 2008-05-21 01:35:00 / 个人分类:AS3 To avoid unnecessary code execution in discarded objects, a program should always deactivate objects before discarding them. Deactivating an object means putting the object in an idle state where nothing in the program can cause it to execute code. For example, to deactivate an object, we might perform any or all of the following tasks: ? Unregister the object’s methods for events ? Stop all timers and intervals ? Stop the playhead of timelines (for instances of movie clips created in the Flash authoring tool) ? Deactivate any objects that would become unreachable if the object, itself, became unreachable 为了避免已被删除对象的代码还在继续进行,要在删除对象之前,停止它内部的所有程序,让它处于闲置状态,外部的事件也无法触发他任何代码。举例来说,我们可以执行下面的步骤: ?注销该对象的方法事件 ?停止所有定时器和间隔 ?停止播放(在Flash时间线工具中创建的电影剪辑) ?断开所有的外部联系,使它变得不可访问 as3和as2的prototype差异 2008-05-21 00:51:58 / 个人分类:AS3 先来看一下例子,把下面这段代码分别发布成as2和as3 MovieClip.prototype.show=function(){ trace("show "+this.name) //as3 trace("show "+this._name) //as2 } MovieClip.prototype.startDrag=function(){ trace("rewrited startDrag") } mc.show() //都会输出 "show mc的名字" mc.startDrag(true)//as2会输出"rewrited startDrag", 但as3里面会开始拖动mc 这段测试说明一个问题,as3里面的prototype只能定义新的变量和函数,不能覆盖已有的 例如,我想让所有的可交互元件不显示Tab焦点矩形,先写成InteractiveObject.prototype.focusRect=false,结果毫无反应,所有mc,button,txt的focusRect都还是null。万幸还有stage.stageFocusRect=false,但如果是其他的需求呢? 使用原形对象设置属性,在as2时代是很常用的方法,到了as3,不知道该咋办了。 有想到好方法的朋友,请解惑,谢谢。