【问题标题】:How to avoid flash.display flickering如何避免 flash.display 闪烁
【发布时间】:2011-05-08 01:20:01
【问题描述】:

来自更'传统' C++ 背景,因此更习惯于处理低级 API,而不是像 flash.display API 这样的东西。

我的问题比较初级,但我的搜索没有找到解决方案。

如何避免显示 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;
    }
}

但是,由于其他人都能做出看似流畅的快速动画,我有点不知道实际上是如何做到的,因为它基本上看起来像是一个同步问题。

【问题讨论】:

标签: actionscript-3 flash tearing


【解决方案1】:

首先:你让你的 CPU 比必要的更努力地工作,25/30 fps 应该可以实现流畅的动画,所以你只能以这个速率调用 step。在更新 x 的 sprite 位置之前,y 确实会发生变化,并且只有在它们发生变化时才会更新。

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

看看精灵:它们有透明度吗?透明度是性能杀手,因为 Flash 必须在每一帧上绘制所有图层。我可以进一步优化它们,例如在不损失质量的情况下将它们尽可能小(以防你使用被缩小到精灵大小的更大图像)。

【讨论】:

  • 是的,这些优化有点傻,只有真正重要的是混合和亚像素精度,我会给你这些。无论如何,没有人真正处理这个问题,这是撕裂。
【解决方案2】:

我已经看到 wmode 参数对动画流畅度有很大影响。相同的 swf 在独立播放器和具有不同 wmode 的 html 页面上的行为不同。经过一些测试,我更喜欢 wmode="direct" - 它提供最流畅的动作,甚至比“gpu”更好。

很高兴使用一些针对 ActionScript 的监控工具查看您的真实 fps,例如,Stats。如果它保持在高位并且您仍然看到生涩的动作,那就是 wmode 问题。而且 60 fps 比 30 更好,如果您不受性能限制,为什么不使用它。

【讨论】:

  • 在发布 ofc 之前使用 Mr.Doobs Stats 进行了基准测试。实际的 swf 与上面发布的示例一样简单。问题不在于性能,而在于无法同步,因此帧在另一个帧的中间被覆盖,从而产生撕裂。
  • 我没有说性能是这里的问题,我只是看到相同的 swf 播放流畅或生涩,具体取决于 wmode。甚至独立的 Flash Player 也不是性能最好的环境。
猜你喜欢
  • 2023-04-02
  • 2013-05-02
  • 2016-06-30
  • 2023-03-22
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多