运行时代码执行基本原理
2011-10-26 18:02
190 查看
了解如何改进应用程序性能的关键是了解 Flash Platform 运行时如何执行代码。运行时在一个循环中运行,其中某些操作是针对每个“帧”发生的。在这种情况下,帧只是由为应用程序指定的帧速率决定的一段时间。分配给每个帧的时间直接对应于帧速率。例如,如果指定帧速率为 30 帧/秒,则运行时会尝试使每个帧的执行时间为三十分之一秒。
可以在创作应用程序时指定初始帧速率。可以使用 Adobe® Flash® Builder™ 或 Flash Professional 中的设置来设置帧速率。还可以在代码中指定初始帧速率。可通过对根文档类应用[SWF(frameRate="24")] 元数据标签,在纯
ActionScript 应用程序中设置帧速率。在 MXML 中,可在 Application 或 WindowedApplication 标签中设置 frameRate 属性。
每个帧循环包括两个阶段,分为三部分:事件、enterFrame 事件和呈现。
第一阶段包括两部分(事件和 enterFrame 事件),这两部分都可能会导致调用代码。在第一阶段的第一部分,发生并调度运行时事件。这些事件可以表示异步操作完成或异步操作的进度,例如来自通过网络加载数据的响应。还包括来自用户输入的事件。调度事件时,运行时在您已注册的侦听器中执行代码。如果没有发生事件,运行时会等待完成此执行阶段,而不会执行任何动作。由于缺少活动,运行时永远不会提高帧速率。如果在执行周期的其他部分发生事件,运行时将这些事件排队并在下一个帧中进行调度。
第一阶段的第二部分是 enterFrame 事件。此事件与其他事件不同,因为每个帧始终只调度一次该事件。
调度所有事件后,帧循环的呈现阶段开始。此时,运行时将计算屏幕上所有可见元素的状态并将其绘制到屏幕上。然后,此进程重复,就像赛跑者围绕跑道奔跑。
注: 对于包括 updateAfterEvent 属性的事件,可强制立即执行呈现操作,而不是等到呈现阶段。但是,如果 updateAfterEvent 频繁导致性能问题,应避免使用它。
最简单的方法是假设帧循环中的两个阶段需要相同的时间。在这种情况下,一半的时间运行帧循环事件处理函数和应用程序代码,另一半的时间发生呈现。但是,事实通常是不同的。有时,应用程序代码会通过增加运行时间并减少用于呈现的时间来占用帧中多一半的可用时间。在其他情况下,特别是对于滤镜和混合模式等复杂的可见内容,呈现需要一半以上的帧时间。由于各阶段需要的实际时间是灵活的,所以帧循环常称为“弹性跑道”。
如果帧循环的组合操作(代码执行和呈现)所需时间太长,运行时将无法保持帧速率。帧会进行扩展,所需时间超过其分配的时间,因此在触发下个帧之前会出现延迟。例如,如果一个帧循环需要的时间超过三十分之一秒,则运行时不能以每秒三十帧的速度更新屏幕。如果帧速率减慢,将影响体验效果。最乐观的情况是动画断断续续。如果情况更糟糕,应用程序将冻结,并且窗口一片空白。
有关 Flash Platform 运行时代码执行和呈现模型的详细信息,请参阅下列资源:
Flash
Player Mental Model - The Elastic Racetrack(文章作者:Ted Patrick)
Asynchronous ActionScript
Execution(文章作者:Trevor McCauley)
优化 Adobe AIR 的代码执行、内存和呈现(网址为 http://www.adobe.com/go/learn_fp_air_perf_tv_cn)(由
Sean Christmann 撰写的 MAX 会议演示文稿的视频)
可以在创作应用程序时指定初始帧速率。可以使用 Adobe® Flash® Builder™ 或 Flash Professional 中的设置来设置帧速率。还可以在代码中指定初始帧速率。可通过对根文档类应用[SWF(frameRate="24")] 元数据标签,在纯
ActionScript 应用程序中设置帧速率。在 MXML 中,可在 Application 或 WindowedApplication 标签中设置 frameRate 属性。
每个帧循环包括两个阶段,分为三部分:事件、enterFrame 事件和呈现。
第一阶段包括两部分(事件和 enterFrame 事件),这两部分都可能会导致调用代码。在第一阶段的第一部分,发生并调度运行时事件。这些事件可以表示异步操作完成或异步操作的进度,例如来自通过网络加载数据的响应。还包括来自用户输入的事件。调度事件时,运行时在您已注册的侦听器中执行代码。如果没有发生事件,运行时会等待完成此执行阶段,而不会执行任何动作。由于缺少活动,运行时永远不会提高帧速率。如果在执行周期的其他部分发生事件,运行时将这些事件排队并在下一个帧中进行调度。
第一阶段的第二部分是 enterFrame 事件。此事件与其他事件不同,因为每个帧始终只调度一次该事件。
调度所有事件后,帧循环的呈现阶段开始。此时,运行时将计算屏幕上所有可见元素的状态并将其绘制到屏幕上。然后,此进程重复,就像赛跑者围绕跑道奔跑。
注: 对于包括 updateAfterEvent 属性的事件,可强制立即执行呈现操作,而不是等到呈现阶段。但是,如果 updateAfterEvent 频繁导致性能问题,应避免使用它。
最简单的方法是假设帧循环中的两个阶段需要相同的时间。在这种情况下,一半的时间运行帧循环事件处理函数和应用程序代码,另一半的时间发生呈现。但是,事实通常是不同的。有时,应用程序代码会通过增加运行时间并减少用于呈现的时间来占用帧中多一半的可用时间。在其他情况下,特别是对于滤镜和混合模式等复杂的可见内容,呈现需要一半以上的帧时间。由于各阶段需要的实际时间是灵活的,所以帧循环常称为“弹性跑道”。
如果帧循环的组合操作(代码执行和呈现)所需时间太长,运行时将无法保持帧速率。帧会进行扩展,所需时间超过其分配的时间,因此在触发下个帧之前会出现延迟。例如,如果一个帧循环需要的时间超过三十分之一秒,则运行时不能以每秒三十帧的速度更新屏幕。如果帧速率减慢,将影响体验效果。最乐观的情况是动画断断续续。如果情况更糟糕,应用程序将冻结,并且窗口一片空白。
有关 Flash Platform 运行时代码执行和呈现模型的详细信息,请参阅下列资源:
Flash
Player Mental Model - The Elastic Racetrack(文章作者:Ted Patrick)
Asynchronous ActionScript
Execution(文章作者:Trevor McCauley)
优化 Adobe AIR 的代码执行、内存和呈现(网址为 http://www.adobe.com/go/learn_fp_air_perf_tv_cn)(由
Sean Christmann 撰写的 MAX 会议演示文稿的视频)
相关文章推荐
- Flash 平台技术的优化(一) 运行时代码执行基本原理
- AS3优化:运行时执行代码的基本原理
- C#让代码运行exe时执行,而时Debug不执行
- Java精确测量代码运行时间 代码执行时间 纳秒 nanoTime
- Spring实战——如何运行第一章的代码(如何生成一个可执行的jar包)
- (转) 正试图在 os 加载程序锁内执行托管代码。不要尝试在DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
- 检测到LoaderLock,正试图在OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码,这样会导致应用程序挂起。
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。问题的解决方法!
- 在AE二次开发中出“正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”异常解决方案
- 公共语言运行时(CLR),它负责管理和执行由.NET 编译器编译产生的中间语言代码
- 在myeclipse中代码修改不起作用:当在myeclipse中修改处理方法的代码时,重新发布Tomcat,在运行时,jsp页面显示内容没变,还是按修改前的代码执行
- Java精确测量代码运行时间 代码执行时间 纳秒 nanoTime
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码
- 如何确定C#代码是在编译时执行还是在运行时执行
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码...
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码
- 运行程序前执行自己的代码
- 【asp.net 】使用js结合hidden控件实现在后台运行一段程序后提示确认,确认通过后继续执行后台代码~~~