【发布时间】:2013-01-05 11:03:49
【问题描述】:
是否可以在 Flash (ActionScript 3) 中进行完全平滑的滚动?在下面的测试中,我将创建一个包含随机噪声的位图,然后定期将其向左移动。我没有在后台运行繁重的任务。我正在寻找的是与 1987 年的 Amiga 500 相当的平滑度:-)
package {
import flash.display.*;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class Game extends Sprite {
var noiseBitmap;
public function Game() {
var noiseBitmapData = new BitmapData(stage.stageWidth * 3, stage.stageHeight);
noiseBitmapData.noise(0, 0, 255, 7, true);
noiseBitmap = new Bitmap(noiseBitmapData);
addChild(noiseBitmap);
var t = new Timer(1000/30, 999999);
t.addEventListener("timer", function (e:TimerEvent) {
noiseBitmap.x--;
});
t.start();
}
}
}
“渲染代码”在我的计算机(2.4 GHz Mac)上运行需要不到 1 毫秒,但移动偶尔仍会卡住一两帧,使移动显得生涩。
在 Flash 中,FPS 设置为 30。我尝试使用“测试电影”和浏览器(Chrome)运行它。目标是 Flash Player 11.2。我也尝试调用 e.updateAfterEvent() 来强制重绘。我也尝试过将延迟和 FPS 设置为略有不同的值,但没有改善。
这与not smooth scrolling in AS3 不同,因为我已经在使用 BitmapData。我也尝试过使用 ENTER_FRAME 事件而不是在回答该问题时建议的计时器,但它没有帮助。
【问题讨论】:
-
帧之间的延迟保持在 31 - 34 毫秒之间。
-
正如在其他地方回答的那样,您绝对应该使用 ENTER_FRAME 而不是计时器。但无论哪种方式,抖动都可能是由垃圾收集器运行引起的。如果您还没有任何分析工具来诊断您的代码,Adobe Scout 非常值得一看(而且免费)。
标签: actionscript-3 flash bitmapdata