假设我们在Flash中有1 fps的动画,其中每个帧都有一个运行100 ms的脚本。据我所知,Flash中的动画的工作原理如下:
0ms: Begin executing Frame 1's frame script
100ms: Finish executing Frame 1's frame script
1000ms: Begin rendering Frame 1's content and frame-script output
1050ms: Finish rendering Frame 1's content and frame-script output
1051ms: Begin executing Frame 2's frame script
1151ms: Finish executing Frame 2's frame script
2000ms: Begin rendering Frame 2's content and frame-script output
2050ms: Finish rendering Frame 2's content and frame-script output
2051ms: Begin executing Frame 3's frame script
2151ms: Finish executing Frame 3's frame script
3000ms: Begin rendering Frame 3's content and frame-script output
3050ms: Finish rendering Frame 3's content and frame-script output
...
此工作流程是合乎逻辑的,因为在等待进行下一次屏幕更新时正在执行框架脚本。即使脚本执行时间长达1000毫秒,渲染也不会延迟,仍然是1fps。
然而!当从AS3内编程动画时,人们经常使用ENTER_FRAME事件,该事件发生在之前下一次屏幕更新。然后,如果我们有执行1000毫秒的指令,则工作流程如下:
0ms: do nothing (waste time!)
1000ms: begin executing instructions in ENTER_FRAME
2000ms: finish executing instructions in ENTER_FRAME
2001ms: Begin rendering Frame 1's content and ENTER_FRAME output
2051ms: Finish rendering Frame 1's content and ENTER_FRAME output
2051ms: do nothing (waste time!), as we have to wait 1000ms from last rendering to current
3000ms: begin executing instructions in ENTER_FRAME (1000ms after last rendering)
4000ms: finish executing instructions in ENTER_FRAME
4001ms: Begin rendering Frame 2's content and ENTER_FRAME output
4051ms: Finish rendering Frame 2's content and ENTER_FRAME output
4051ms: do nothing (waste time!), as we have to wait 1000ms from last rendering to current
5000ms: begin executing instructions in ENTER_FRAME (1000ms after last rendering)
6000ms: finish executing instructions in ENTER_FRAME
6001ms: Begin rendering Frame 2's content and ENTER_FRAME output
6051ms: Finish rendering Frame 2's content and ENTER_FRAME output
...
结果我们有0.5 fps而不是1 fps!延迟是因为ENTER_FRAME在呈现场景之前发生。对我来说,如果在渲染场景后立即发生,准备在下一帧进行渲染,那将是合乎逻辑的。
这是一个玩具示例,在现实世界中,渲染不会在完美的时间表上发生,但逻辑是相同的。当有15毫秒的代码执行每一帧(完全正常的情况)时,60 fps会变成30 fps ......
......不是吗?我所说的是否存在缺陷?
答案 0 :(得分:5)
输入框架是生命周期的开始。
Event.ENTER_FRAME
已发送的事件Event.ADDED
的事件Event.ADDED_TO_STAGE
的事件Event.FRAME_CONSTRUCTED
已发送的事件Event.EXIT_FRAME
已发送的事件Event.RENDER
已发送的事件Event.REMOVED
的事件Event.REMOVED_FROM_STAGE
的事件您所描述的通常被称为弹性赛道,其中繁重的代码执行会延迟帧渲染。