1

假设我们在 Flash 中有一个 1 fps 的动画,其中每一帧都有一个运行 100 毫秒的脚本。据我所知,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
...

此工作流程是合乎逻辑的,因为在等待下一次屏幕更新时正在执行框架脚本。即使脚本执行时间长达 1000ms,渲染也不会延迟,仍然是 1fps。

然而!在 AS3 中编写动画时,人们经常使用 ENTER_FRAME 事件,该事件发生在下一次屏幕更新之前。那么,如果我们有需要 1000ms 执行的指令,那么工作流程如下:

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 发生渲染场景之前。对我来说,如果 ENTER_FRAME 在渲染场景后立即发生,为下一帧的渲染做准备,那将是非常合乎逻辑的。

这是一个玩具示例,在现实世界中,渲染不会以完美的时间表进行,但逻辑是相同的。当每帧有 15 毫秒的代码执行时(完全正常的情况),60 fps 会变成 30 fps...

... 或不?我说的有问题吗?

4

1 回答 1

5

进入框架是生命周期的开始。

输入框

显示对象生命周期

  1. Event.ENTER_FRAME派发的事件类型的事件
  2. 子显示对象的构造函数代码被执行
  3. Event.ADDED从子显示对象调度的事件类型的事件
  4. Event.ADDED_TO_STAGE从子显示对象调度的事件类型的事件
  5. Event.FRAME_CONSTRUCTED派发的事件类型的事件
  6. 执行 MovieClip 帧动作
  7. 执行子 MovieClip 的帧动作
  8. Event.EXIT_FRAME派发的事件类型的事件
  9. Event.RENDER派发的事件类型的事件
  10. Event.REMOVED从子显示对象调度的事件类型的事件
  11. Event.REMOVED_FROM_STAGE从子显示对象调度的事件类型的事件

您所描述的通常被称为弹性跑道,其中繁重的代码执行可能会延迟帧渲染。

弹性跑道

帧率

于 2013-05-09T18:51:01.833 回答