2011-05-07 99 views
4

来自更多'传统' C++背景更多地用于处理低级API,而不是类似于flash.display API。如何避免flash.display闪烁

我的问题是相当原始的,但我的搜索没有找到解决方案。

如何避免显示API中的屏幕撕裂/闪烁? 即使像60 fps这样高的帧速率,我也会遇到一些相当令人讨厌的帧间闪烁/撕裂现象。

请看下面的简单例子,其中Sprite的子元素只是Shape的实例而且从不改变。

private function onEnterFrame(event:Event):void 
{ 
    var t:Number = (getTimer() - time)/1000; 
    time = getTimer(); 

    step(t); 
} 

private function step(t:Number):void { 
    var speed:Number = 100; 

    for (var i:uint = 0; i < numChildren; i++){    
     getChildAt(i).x += speed * t; 
     getChildAt(i).y += speed * t; 
    } 
} 

然而,因为所有人都能够做到看似流畅的快的动画我有点困惑的是如何真正做到这一点,因为它基本上看起来像一个同步问题。

+2

http://stackoverflow.com/questions/989471/vsync-in-flex-flash-as3 – jedierikb 2011-05-07 11:15:12

回答

1

首先:你让你的CPU工作比必要的更难,25/30 fps应该做一个流畅的动画,所以你只能以这个速度调用step。在更新x的精灵位置之前,y只有在它们发生变化时才会更改和更新。

让你的循环尽可能紧凑:把numChildren(方法调用)从循环中取出。使速度变为int而不是数字(更快)

看看精灵:他们是否具有透明度?透明度是一个性能杀手,因为Flash必须绘制每一帧的所有图层。我可以进一步优化它们,例如使它们尽可能小,而不会丢失质量(如果您使用的是更大的图像,则会缩小到精灵大小)。

+0

是的,这些优化是愚蠢的,只有那些应该真正重要的是混合和亚像素精度我会给你那些。无论如何,没有人真正处理这个问题,这是撕裂。 – 2011-05-08 04:18:14

0

我见过wmode参数对动画平滑度有很大影响。同样的swf在独立播放器和不同wmode的html页面中表现不同。经过一些测试后,我更喜欢wmode =“直接” - 它提供了最流畅的运动,甚至比“gpu”更好。

用ActionScript的一些监视工具(例如Stats)很高兴看到您的真实fps。如果它仍然很高,你仍然看到生涩的动作,这是wmode问题。 60 fps比30好,如果你没有性能限制,为什么不使用它。

+0

在张贴ofc之前是否使用Mr.Doobs Stats进行基准测试。实际的swf和上面发布的例子一样简单。问题不在于性能,但是无法同步帧的事实会在另一个产生撕裂的帧的中间被覆盖。 – 2011-05-08 04:14:22

+1

我没有说性能是这里的问题,我只是看到同样的swf播放顺利或生涩,这取决于wmode。即使是独立的Flash Player也不是性能最好的环境。 – alxx 2011-05-08 10:23:49