我今天在调查一些非常奇怪的事情时遇到了这个话题。在我们的 Flex 应用程序中执行某些操作会导致渲染帧数猛增,从 12fps 到 ~30fps:加载的动画开始高速播放,GUI 开始锁定。
由于我在 Flex/Flash 上阅读的所有内容都强调了“帧速率限制在顶级应用程序中设置的 fps”这一点,因此这些额外渲染发生的唯一方法似乎是由于某些事件导致它们(在任何地方都没有对舞台的帧速率进行任何程序化更改)。由于它仅在我将更新逻辑放入 ENTER_FRAME 处理程序时发生,所以我试图找出可能发生的情况,这显然导致 Flex 变得疯狂渲染。
假设:我的更新函数中的某些内容正在触发立即屏幕更新,这会立即引发另一个 ENTER_FRAME,这意味着我的更新循环被调用,这会触发另一个立即屏幕更新,...
如果这是一个因素,我们的 GUI 中使用了 Flex 组件。我真的不知道下一步该去哪里。
澄清:
- 当我说事情加速时,这有两种表现形式。
- 首先,我的 ENTER_FRAME 处理程序被更频繁地调用。
- 其次,加载了内置循环动画的 Flash SWF 突然加速到它看起来很傻的程度。
- 我没有使用updateAfterEvent,我只是在研究这个问题时才发现它存在。显然,Sprite 子类上的一些事件会自动调用它,我想知道这是否是根本原因。
- 我根本没有直接搞乱渲染。背景动画会自动播放,因为它们具有来自 CS3 创作的内置时间线,我们的所有更新功能所做的只是更改 DisPlayObjects 的位置或添加/删除它们等
更新: 我在我的应用程序中添加了一个标签来打印 stage.frameRate,并发现在某些时候,它突然从 12 变为 1000(允许的最大值)。虽然向我的 ENTER_FRAME 处理程序添加一行来重置它是微不足道的,但这几乎没有什么大帮助。此外,即使这样做,渲染也一团糟。某些操作(例如发出警报弹出窗口)会使它重新焕发生机。不幸的是,我无法查看 Stage 类的源代码以在 setter 属性上设置断点。
这对于 Flex 加载“设置为 1000fps”的事情非常有趣。我们有几个 Flex 应用程序,它们都提供了一个通用接口。主应用程序负责通过 SWFLoader 类根据需要加载这些模块。但是,加载过程已经考虑到延迟加载......当 SWF 加载时,我们然后等待来自 SystemManager 的 APPLICATION_COMPLETE。收到此信息后,是否应该完成应用程序?