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

键盘、鼠标、定时器的事件的方法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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值