1

我今天在调查一些非常奇怪的事情时遇到了这个话题。在我们的 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。收到此信息后,是否应该完成应用程序?

4

3 回答 3

4

Flex 在 Flex 组件的“分阶段实例化”期间将帧速率设置为 1000,这仅在 flex swf 的初始加载期间发生。这允许它非常快速地构建所有组件。

您是否正在等待 Flex 应用程序完全加载和构建?在使用 Flex 内容之前,您应该等待 FlexEvent.CREATION_COMPLETE。

如果您想知道发生这种情况的位置,请查看 Flex LayoutManager 类的第 326 行(使用 Flex SDK 3.0.194161),在属性 usePhasedInstantiation 的设置器中。

更新:

APPLICATION_COMPLETE 应该为您提供初始加载。

这实际上发生在任何时候直接从 MXML 创建组件时。因此,还有一些其他情况需要寻找。您是否使用任何中继器?您是否使用任何按需构建其子级的导航容器?

于 2008-09-29T11:17:22.870 回答
1

Thanks for the clarifications. If a loaded clip with a animation (I assume you mean a frame animation) is speeding up, then that certainly sounds like something is changing your playback framerate, as opposed to other things that could be going on. With that said it's not a problem I've seen crop up before, but I do think there are some things you could try that ought to narrow down where the problem is:

  1. You might as well try tracing out stage.frameRate during the speed-up. Presumably nothing ought to be changing your framerate, but since that would explain your issues you might as well rule it out.

  2. Try removing as many GUI components as possible and seeing if the problem still occurs, if it's possible to trigger the problem without them.

  3. One sanity check you could try, if it's feasible, is to copy some of the contents of your game into a fresh project and try it there. Sometimes mysterious issues like this happen because some class or SWC is being imported somewhere that everyone forgot about.

  4. You could try driving your code from a different event. For example, as far as I know driving it from Event.EXIT_FRAME or Event.FRAME_CONSTRUCTED ought to look the same, but if it doesn't then that's a hint. Alternately, you could try driving it from something like a keyboard event or MouseEvent.MOUSE_MOVE. Then if updates occur even though you're not firing events, you'll know something else is driving things besides your event loop.

Those are the things I'd try, anyway. Hope you track it down...

于 2008-09-27T15:36:28.253 回答
1

我不清楚的一件事-您是否看到实际的屏幕刷新速度比发布的帧速率更快?还是您的动画移动得更快但屏幕刷新没有改变?(也就是说,它曾经每秒移动 10 个像素,但现在它的移动速度比这更快,无论屏幕绘制的频率如何。)

一个简单的检查方法是尝试以 1 fps 发布您的内容。应该清楚屏幕是否每秒重绘一次,但动画元素的移动比这更频繁,或者屏幕是否实际上更新更频繁。

如果是后者,您是否updateAfterEvent()在代码中使用了任何方法?这可能会导致实际屏幕刷新比发布的帧速率更快。但它不应该影响ENTER_FRAME事件。您仍然应该只获得每帧更新中的一个。

或者,您正在制作动画的只是 Sprite 等,还是您将它们实现为 Flex 组件,并尝试使用invalidate()方法和 RENDER 事件等重绘它们?

如果您可以澄清问题中的一些要点,答案可能会更清楚。谢谢...

于 2008-09-27T08:02:44.447 回答