4

来自更“传统”的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;
    }
}

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

4

2 回答 2

1

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

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

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

于 2011-05-07T08:54:52.827 回答
0

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

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

于 2011-05-07T17:20:01.743 回答