Flex Post事件屏幕更新

时间:2020-03-06 14:48:06  来源:igfitidea点击:

我今天在调查一些非常奇怪的东西时遇到了这个话题。在我们的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。收到此通知后,是否应该完成申请?

解决方案

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

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

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

或者,我们是要对Sprites进行动画处理等等,还是将它们实现为Flex组件,并尝试使用invalidate()方法和RENDER事件等重绘它们?

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

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

  • 我们不妨尝试在加速过程中找出stage.frameRate。大概没有什么可以改变帧速率,但是既然这样可以解释问题,我们最好将其排除在外。
  • 尝试删除尽可能多的GUI组件,并查看问题是否仍然存在,如果没有这些组件就可以触发问题。
  • 如果可行,可以尝试的一项健全性检查是将游戏的某些内容复制到一个新的项目中,然后在其中进行尝试。有时会发生诸如此类的神秘问题,因为某些类或者SWC被导入到每个人都忘记的地方。
  • 我们可以尝试从其他事件驱动代码。例如,据我所知,从Event.EXIT_FRAME或者Event.FRAME_CONSTRUCTED驱动它应该看起来一样,但是如果不是,那只是一个提示。或者,我们可以尝试通过键盘事件或者" MouseEvent.MOUSE_MOVE"之类的东西来驱动它。然后,即使我们没有触发事件也发生了更新,我们将知道除了事件循环之外,还有其他因素正在推动着事情。

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

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

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

如果要引用此情况的发生位置,请在属性usePhasedInstantiation的设置器中的Flex LayoutManager类的第326行(使用Flex SDK 3.0.194161)中查找。

更新:

APPLICATION_COMPLETE应该涵盖初始负载。

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