您的位置:首页 > 其它

stage.invalidate()、event.updateAfterEvent()对渲染的影响

2012-12-03 20:48 411 查看
键盘、鼠标、定时器的事件的方法updateAfterEvent会让Flashplayer立即更新屏幕,但是不会发生Event.RENDER事件。

stage.invalidate()不会让Flashplayer立即更新屏幕,但是会促使Flashplayer发出Event.RENDER事件。

updateAfterEvent和stage.invalidate的结合会让促使Flashplayer发出Event.RENDER事件,同时立即更新屏幕。

*下面实验结果验证了这些事实的同时还说明了一些事情:

1. 定时器并非如设想的那样等时间间隔发生。

2.updateAfterEvent不会促使所在帧提前结束,也就是说它对帧频没有影响(这个结果证明了网间说法是错误的)。

下例中,在onTime函数中,注释掉了stage.invalidate()。你会发现onRender函数没有被触发。

也就是说尽管updateAfterEvent使得立即更新屏幕,但是RENDER事件没有发生。如果在onRender函数中定义了内容,该内容被忽略。

package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;

public class testAS extends Sprite {

private var startW:int = 10;
private var time:Timer = new Timer(300);

public function testAS() {
//设置帧频为1秒1帧
this.stage.frameRate = 1;
//监听ENTER_FRAME和RENDER事件
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
this.addEventListener(Event.RENDER,onRender);
//设定定时器,时间间隔小于1秒
time.addEventListener(TimerEvent.TIMER, onTime);
time.start();

}

public function onEnterFrame(e:Event):void
{
//记录时刻
var now:Date = new Date();
trace("onEnterFrame=" + now.seconds + " " + now.milliseconds);
}
public function onRender(e:Event):void
{
//记录时刻
var now:Date = new Date();
trace("onRender=" + now.seconds + " " + now.milliseconds + "\n");
}
public function onTime(e:TimerEvent):void
{
//记录时刻
var now:Date = new Date();
trace("onTime=" + now.seconds + " " + now.milliseconds + "\n");

//为了触发Event.RENDER事件,而修改画面外观
this.graphics.clear();
this.graphics.lineStyle(1,0x998877);
this.graphics.drawRect(10,10,startW,20);
//this.stage.invalidate();
startW += 5;

e.updateAfterEvent();

}
}
}


结果:

[SWF] C:\Users\Administrator\Adobe Flash Builder 4.6\testAS\bin-debug\testAS.swf - 解压缩后为 1,875 个字节
onTime=45 64
onTime=45 140
onEnterFrame=45 489      //证明了帧频的确为1
onTime=45 673
onTime=46 207            //证明了尽管调用了event.updateAfterEvent(),并且从屏幕上看到了预期的变化,但是onRender函数并没有执行(RENDER事件没有发生)
onEnterFrame=46 474
onTime=46 740
onTime=47 273
onEnterFrame=47 476
onTime=47 807
onTime=48 410
onEnterFrame=48 476
onTime=48 874
onTime=49 407
onEnterFrame=49 474
onTime=49 940             //证明了定时器并非等时间间隔触发
onEnterFrame=50 476
onTime=50 477
onTime=51 6


再释放stage.invalidate()。重新执行,你会发现onRender函数被触发。

[SWF] C:\Users\Administrator\Adobe Flash Builder 4.6\testAS\bin-debug\testAS.swf - 解压缩后为 1,898 个字节
onTime=14 257
onRender=14 261
onTime=14 472
onRender=14 474
onEnterFrame=14 678          //证明了帧频仍然为1,并没有受到stage.invalidate()、event.updateAfterEvent()的影响。
onTime=15 5
onRender=15 7                //证明了stage.invalidate()、event.updateAfterEvent()的共同作用下,onRender函数被执行了(RENDER事件发生了)。                             //且RENDER事件的发生并没有使该帧提前结束。
onTime=15 539onRender=15 540onEnterFrame=15 689onTime=16 73onRender=16 75onTime=16 606onRender=16 607onEnterFrame=16 683onTime=17 139onRender=17 140onEnterFrame=17 674onTime=17 675onRender=17 677onTime=18 206onRender=18 208onEnterFrame=18
675onTime=18 739onRender=18 741


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: