【问题标题】:Flex Post Event Screen UpdatesFlex 事件后屏幕更新
【发布时间】:2010-09-13 13:42:24
【问题描述】:

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

【问题讨论】:

    标签: apache-flex flash actionscript-3 performance profiling


    【解决方案1】:

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

    检查这一点的一种简单方法是尝试以 1 fps 的速度发布您的内容。应该清楚是屏幕每秒重绘一次,但动画元素的移动频率比这更高,还是屏幕实际上更新频率更高。

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

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

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

    【讨论】:

      【解决方案2】:

      感谢您的澄清。如果带有动画的加载剪辑(我假设您的意思是帧动画)正在加速,那么这听起来肯定会改变您的播放帧速率,而不是其他可能发生的事情。话虽如此,这不是我以前见过的问题,但我确实认为您可以尝试一些方法来缩小问题所在:

      1. 您不妨在加速期间尝试追踪stage.frameRate。大概没有什么应该改变你的帧率,但既然这可以解释你的问题,你不妨排除它。

      2. 尝试删除尽可能多的 GUI 组件,看看问题是否仍然存在,如果没有它们也可能触发问题。

      3. 如果可行的话,您可以尝试的一个健全性检查是将游戏的一些内容复制到一个新项目中并在那里尝试。有时会发生这样的神秘问题,因为某些类或 SWC 被导入到每个人都忘记的地方。

      4. 您可以尝试从不同的事件驱动您的代码。例如,据我所知,从Event.EXIT_FRAMEEvent.FRAME_CONSTRUCTED 驱动它看起来应该是一样的,但如果不是,那就是一个提示。或者,您可以尝试通过键盘事件或MouseEvent.MOUSE_MOVE 等方式驱动它。然后,如果即使您没有触发事件,也发生了更新,您就会知道除了事件循环之外还有其他东西在驱动。

      无论如何,这些都是我会尝试的。希望你能找到它...

      【讨论】:

        【解决方案3】:

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

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

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

        更新:

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

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

        【讨论】:

        • 啊,我没想到任何 MXML 组件都会引发 APPLICATION_COMPLETE。这对于我所看到的当然是有道理的。我需要对此进行进一步澄清,但将其作为一个新问题提出是有道理的。
        • 它实际上是 CREATION_COMPLETE 用于除 Application 类之外的任何组件,但它的用途相同。
        猜你喜欢
        • 2011-04-27
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多