2011-05-03 46 views
0

我试图敲掉我的应用程序的一些cpu周期,我想知道最少的cpu密集型方法是执行代码。flex性能,方法调用或事件

拿这两个例子。第一个是运行并调用各种方法的输入框。 第二个是相同的输入框,但调度事件。

1)这些框架中的其中一个框架可能比其他框架的cpu密集程度低吗?

2)在第一个例子中,帧必须等到方法1 2和3完成之后,下一帧才能呈现并执行代码?

3)在第二个例子中,调用方法1 2和方法3的事件是否可以在除调用方法的框架中执行? EG,如果CPU处于压力之下,它能推迟执行吗?

public function enterframe(e:Event):void 
{ 
method1(); 
method2(); 
method3(); 
} 

public function enterframe(e:Event):void 
{ 
dispatchEvent(MethodEvent.Test, method1); 
dispatchEvent(MethodEvent.Test, method2); 
dispatchEvent(MethodEvent.Test, method2); 
} 

回答

1

我认为你可以做的最好的事情就是忘记enterFrame事件。在您的代码中放置一个Timer,并根据您的确切需要设置延迟。您可以轻松体验巨大的优化。

据我所知enterFrame是连接到fps。所以如果你的电影是30fps的动画,那么它将每秒运行30次。

现在,这意味着它更像是一个区间(flash.utils.setInterval)或Timer

因此,您可以看到,enterFrame或多或少是一种设置间隔或间隔类功能的简单方法。如果你知道你的需求,刷新率和东西,你可以更精确地设置定时器和时间间隔,以获得巨大的性能提升。

+0

定时器也连接到帧速率。像enterFrame一样,定时器也只在帧中执行。例如:https://github.com/ethankennerly/regulate – 2013-05-21 14:58:12

1

编辑:因为我弄糊涂了通过内置的AS3代码派遣我的第一个答案是不正确的Flash播放器的功能和自定义事件调度的事件。虽然Flash播放器本身是多线程的,但您无法访问as3中的线程功能。下面是我修改的答案:

1)难道是有可能为这些 enterframes的一个不那么CPU密集型 比其他?

那么,如果你看指令的数量,调度一个事件的指令有更多的指令,直到它实际执行方法中的代码。它首先必须通过事件监听器列表,然后在特定对象中查找与给定事件类型相比较的对象。

2)在第一示例执行帧 要等到方法1 2和3 已下一 帧之前完成可以呈现并执行代码?

是。在第二个例子中发生了同样的事情。

3)在第二实施例可以在事件 分派到方法1 2和3是在一个比 调用它以外的帧执行 ? EG,如果在压力下CPU是 可以推迟执行 ?

不,它们是以程序方式执行的。


老答案:

1)难道是有可能为这些 enterframes之一是CPU不够密集 比其他?

那么,如果你看指令的数量,调度一个事件的指令有更多的指令,直到它实际执行方法中的代码。尽管事件分派为每个方法创建一个新线程,以便它们同时运行。你花费在那些额外的指令上来调用你将在线程拆分中获得的方法。因此,如果您在每种方法中都有很多说明,我会说事件派发速度更快。

2)在第一示例执行帧 要等到方法1 2和3 已下一 帧之前完成可以呈现并执行代码?

是。

3)在第二实施例可以在事件 分派到方法1 2和3是在一个比 调用它以外的帧执行 ? EG,如果在压力下CPU是 可以推迟执行 ?

由于代码在单独的线程中执行和输入帧继续之前的第一个取决于有多少指令有在每个方法完成的方法可以被执行多次。

+0

@Ancide。 “_尽管事件分派为每个方法创建一个新线程,所以它们同时运行”。他们不会同时运行。 – 2011-05-03 20:38:31

+1

等待一分钟。如果3个线程在彼此之后创建,它们同时运行 – rzetterberg 2011-05-03 20:40:14

+0

从什么时候闪存运行在多个线程中? – 2011-05-03 20:40:37

1

这是过早优化的经典案例。无论您使用事件驱动方法还是方法调用都应该基于良好的设计实践,而不是基于哪一种更快。在任何情况下,Flex大多数都是异步的,它使用事件驱动模型和后期概率来维护松散的组件耦合和事件链接,而您正在寻找的方法不会有助于显着的性能改进(尤其是cpu周期) 。如果你认为你的性能不是最佳,我建议你使用Flex Profiler。 (主要是在内存中存储的部件,减慢Flex应用程序。只要你释放过时的组件的参考...)

+0

这不是真的不成熟。我一直在研究这个项目一段时间。我认为除了表演之外它是完整的。在某些机器上运行良好,但在其他机器上,CPU将攀升至50%,浏览器将崩溃。我花了时间在剖析器上,但似乎没有任何额外的对象不应该在那里。如果在某些机器上运行良好,我是否会在这里找到想要改进的地方 – dubbeat 2011-05-03 21:04:30

+0

是否没有提到环境问题。你认为一般情况下的性能可以得到改善,或者你正试图在某些机器上调试性能问题......在以后的情况下,你应该看看flash player。 – 2011-05-03 21:13:51

0

看起来,你在dispatchEvent(MethodEvent.Test, method1);误认为你应该先使用addEventListener功能。

addEventListener(MethodEvent.Test, method1); 
addEventListener(MethodEvent.Test, method2); 
addEventListener(MethodEvent.Test, method3); 

然后dispatchEvent(MethodEvent.Test);。这两种变体在性能上没有显着差异。调度事件只是调用监听器数组中的每个函数。所以唯一的性能问题是循环侦听器数组。