Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex Flex评测-[enterFrameEvent]在做什么?_Apache Flex_Profiling_Enterframeevent - Fatal编程技术网

Apache flex Flex评测-[enterFrameEvent]在做什么?

Apache flex Flex评测-[enterFrameEvent]在做什么?,apache-flex,profiling,enterframeevent,Apache Flex,Profiling,Enterframeevent,我的任务是在交付给我们的Flex应用程序中发现(并可能修复)一些严重的性能问题。当应用程序处于空闲状态且不应该做任何事情时,它将始终占用50%到100%的CPU 我的第一步是运行FlexBuilder附带的分析器。我希望找到一些占用大部分时间的方法,告诉我瓶颈在哪里。然而,我得到了一些意想不到的东西 排名前4位的方法是: [enterFrameEvent]-84%累积,32%自时间 [收获]-20%的累积和自我时间 [tincan]-8%的累积和自我时间 global.isNaN-4%的累积和

我的任务是在交付给我们的Flex应用程序中发现(并可能修复)一些严重的性能问题。当应用程序处于空闲状态且不应该做任何事情时,它将始终占用50%到100%的CPU

我的第一步是运行FlexBuilder附带的分析器。我希望找到一些占用大部分时间的方法,告诉我瓶颈在哪里。然而,我得到了一些意想不到的东西

排名前4位的方法是:

  • [enterFrameEvent]-84%累积,32%自时间
  • [收获]-20%的累积和自我时间
  • [tincan]-8%的累积和自我时间
  • global.isNaN-4%的累积和自我时间
所有其他方法的累积时间和自我时间均小于1%

根据我在网上找到的,[bracketed methods]是探查器在没有实际Flex方法显示时列出的方法。我看到有人声称[tincan]是处理RTMP请求的,我假设[reap]是垃圾收集器

有人知道[enterFrameEvent]实际上在做什么吗?我假设它本质上是事件循环的“main”函数,因此预计会有很高的累积时间。但为什么自我时间如此之高?到底发生了什么?我没想到播放器内部会占用这么多时间,尤其是因为应用程序中没有实际发生任何事情(而且没有UI更新)


有没有什么好方法可以找到正在发生的事情?我知道发生了一些不应该发生的事情(看起来一定有某种繁忙的等待或其他失控的循环),但是分析器没有给我任何我期望的结果。我的下一步是开始在不同的地方添加调试跟踪语句,以尝试跟踪实际发生的情况,但我觉得必须有更好的方法。

我认为您的问题在其他地方。这是因为Flex构建在Flash之上,Flash以帧速率(每秒20-30次)触发该事件


编辑:我不是说你的解决方案是降低帧率。只有当你注意到的事件是问题的时候,这才有效。我不相信这就是导致你减速的原因。可能是调用函数导致了问题。。。但那件事本身不是。它应该会开火很多。

贾斯汀,谢谢你的回复。 问题不在于enterFrame的执行,而在于它试图在每次迭代中做得太多

仅供参考:巧合的是,原来的海报和我正在处理同一个应用程序。我们决定删除所有Degrafa资源,以支持ProgrammaticSkins。完成后,我将在这里报告调查结果。

一些更新: 除了监听事件和使用绑定之外,我们在应用程序中没有做任何事情……这意味着,没有变更观察者,没有手动轮询……只是等待事件。我们一直都连接到FMS,所以有一些开销,但这是最小的。在Flex中绑定并不是超级高效的,我们发现直接将[Bindable]元数据关键字添加到类中是不好的(在大量的类中)。我们在这方面做的不多,但这是从应用程序中挤出更多性能的一种方法。如果您使用[Bindable(event=“usersUpdated”)],那么您可以控制绑定,并且只有在您从类中的函数(即“users”的setter)中分派事件(new event(“usersUpdated”))时,它才会激发

任何在Flex或AIR中使用过System.gc()的人都会告诉你Flex垃圾收集是个笑话。这是一个部分实现的特性,没有人信任它。这也有诀窍…叫两次,等一下,再叫一次。它可能会清理您的旧对象,但不要交叉手指……Flex做它想做的事情

另外,使用临时对象可以减少触发的绑定数量。而不是

myUser.location=新位置(); myUser.location.state=“CO”; myUser.location.city=“丹佛”

var tempLoc:Location=新位置(); tempLoc.state=“CO”; tempLoc.city=“丹佛”; myUser.location=tempLoc

前者对绑定到location.*的任何对象激发3个绑定,而后者只激发1个绑定(实际上,由于Flex处理它的方式,这通常是额外的)

绑定不会杀死你的应用,除非你在一个视觉丰富的应用程序中有很多绑定。绑定和渲染似乎是Flex最慢的工作

另一件有趣的事情:在Flex Builder中创建一个全新的Flex3应用程序,并在浏览器中运行它。我们的测试表明,MacBookPro的CPU保持在8-10%之间(当应用程序空闲时,浏览器窗口隐藏)我们的应用程序现在稳定地以大约20%的速度运行,虽然为了处理视图更改等,它的峰值会更高,但它总是会返回到接近20%的水平。我们最初担心的是内存泄漏或某些东西跑掉,这会使CPU非常高,并使其徘徊在40-50%左右(同样,在MBP上……所有这些都与这台机器有关)。我们删除了所有对Degrafa的引用,虽然我们注意到性能有了很大的提高,但这并不能说明一切。空的Flex应用程序很有启发性——Flex本身在任何时候都占用8-10%的CPU,即使在空闲时也是如此

还有一个发现……如果使用Mate,请注意如何处理视图切换。通过在MXML中使用注入器和绑定,可以很容易地使资产可用,并且在不使用资产时只需隐藏和禁用它们,但是Flex在隐藏/禁用资产时不是很聪明。最好是动态创建视图,并在完成后销毁它们。尽管初始创建可能需要更多的时间,视图之间的等待时间也会更长,但请使用一些显示魔术(进度条、旋转磁盘等)