AS3获得更平滑的图像旋转

时间:2014-09-11 21:58:03

标签: actionscript-3

我有一个计时器,每隔10毫秒旋转图像2次1000次。它旋转得很好,但有时(并非总是)我看到一段时间的口吃,它并不大但是很明显。如何更改我的代码以防止这种情况?有没有比使用“mc.rotationZ”更快更好的方法?可能是我的计时器有10ms的时间周期,这会导致问题吗?

编辑:如果计时器有问题,它的替代品是什么?

startbtn.addEventListener(MouseEvent.CLICK,okreni1);
var tajmer:Timer=new Timer(10,1000);
tajmer.addEventListener(TimerEvent.TIMER,okreni2);

function okreni1(e:Event){
    startbtn.mouseEnabled = false;
    tajmer.start();
}

function okreni2(e:Event){
    wheel.wrotate.rotationZ += 2;

    if(tajmer.currentCount == 1000){
        trace("tajmer se zavrsio");
        startbtn.mouseEnabled = true;
        tajmer.reset();
    }
}

2 个答案:

答案 0 :(得分:2)

  1. 可能是表现(更新:从您的评论中我会说这不太可能)
  2. 确保使用图像,在其上启用位图平滑并关闭像素捕捉。
  3. 确保您使用GPU加速发布。
  4. 确保您没有大量扩展wrotate的父级。当事情变得非常紧张时,你可以进入不稳定的动作。
  5. 如果您每帧更新对象而不是计时器事件,则可能会解决问题。虽然这不是你的主要问题,但最好这样做。

    在10ms时,你实际上的变化速度超过60fps(16.6ms)。在flash pro的默认24fps(41.6ms),即4个计时器滴答之前,您的更改将被绘制。另外,即使您正确地计算了数学,计时器也无法可靠地同步到帧速率。

    我已经修改了你的代码,这样定时器只有一个时间跨越整个旋转持续时间。输入框架侦听器处理旋转,以便与应用程序的实际帧速率同步。

    startbtn.addEventListener(MouseEvent.CLICK,okreni1);
    var tajmer:Timer=new Timer(10000, 1); //just fire it once 
    tajmer.addEventListener(TimerEvent.TIMER,okreni2);
    
    function okreni1(e:Event){
        startbtn.mouseEnabled = false;
        tajmer.reset();
        tajmer.start();
        wheel.addEventListener(Event.ENTER_FRAME, updateWheel,false,0,true); //run updateWheel every frame
    }
    
    function okreni2(e:Event){
        wheel.removeEventListener(Event.ENTER_FRAME,updateWheel,false);  //remove the listener so it stops rotating
        trace("tajmer se zavrsio");
        startbtn.mouseEnabled = true;
    }
    function updateWheel(e:Event){
        wheel.wrotate.rotationZ += 2;
    }
    

    顺便说一句,这种情况是补间的理想选择。如果您想使用流行的TweenLite,您的代码将如下所示:

    import com.greensock.TweenLite;
    import com.greensock.easing.Linear;
    import com.greensock.easing.Quad;
    
    startbtn.addEventListener(MouseEvent.CLICK,okreni1);
    
    function okreni1(e:Event){
        startbtn.mouseEnabled = false;
    
        //this tells wheel.wrotate to animate over 10 seconds from the current rotationZ value to an additional 20000.  Ease none means have the velocity constant the whole time. 
        //alternatively you could use a different ease, like Quad.easeInOut if you want a nice smooth start and stop
        TweenLite.to(wheel.wrotate, 10, { rotationZ: wheel.wrotate.rotationZ + 20000, ease: Linear.easeNone, onComplete: okreni2 });
    }
    
    function okreni2(e:Event){
        startbtn.mouseEnabled = true;
    }
    

答案 1 :(得分:0)

奇怪的是,我在学校的旧电脑上测试了我的FLA(swf),其中包含1个cpu核心和集成的gpu,旋转(动画)完美无缺。但我想也许问题出在我的flash专业版或flash播放器中。我将重新安装并更新我的软件。非常感谢@LMDS提供所有帮助。