我可以使用什么而不是计时器来帮助我的表现?

时间:2017-05-30 23:57:15

标签: actionscript-3 flash timer actionscript cs3

我的应用在移动设备上非常慢。

它使用了很多Event.ENTER_FRAME个事件监听器,所以我切换(因为我读它们的性能更重)到全局定时器,这些类在需要更新时会监听(它们只使用这些定时器)如果它们是由TouchEvent发起的。

我还尝试启用硬件加速,并切换到使用CPU,但这些并没有帮助将延迟问题提高到显着的数量。 (我的应用程序动画很少,所以我认为这是最好的决定)

我确实有很多MovieClip,但实际上很少有动画,所以我怀疑这是一个问题。 (这也是我不冻结和解冻物体的原因,因为它们永远不会从舞台上移除)

this website上他们说了以下关于计时器的内容

  

- 在系统中停留的计时器实例越多,您就越能期望缓慢而不稳定的游戏玩法或无法响应的用户界面。

我只使用一个计时器,所以我不认为这会是一个问题,但我确实有很多事件监听器使用这个计时器来更新,所以我只能认为计时器必须是问题。因此,为了避免滞后,我正在寻找更好的选择。

要清楚,我不再使用很多Event.ENTER_FRAME事件监听器了,我大部分时间都转向了定时器。话虽如此,这是一个需要更多资源的例子。

package 
{

    import flash.display.MovieClip;
    import flash.events.Event;

    public class mc_BattleScene extends MovieClip
    {
        public static var mc_PlayerFace:MovieClip;
        public static var enemyAttackEffect:MovieClip;
        public static var mc_playerHitBox:MovieClip;

        public static var battler1:Number = 1;
        public static var battler2:Number = 1;
        public static var battler3:Number = 1;

        public var lvlModifier:Number;
        public var dmgReduction:Number;
        public var dmgDealt:Number;

        public static var dmgSpeed:Number = 1;

        public function mc_BattleScene()
        {
            visible = false;
            addEventListener(Event.ENTER_FRAME, onFrame);
            mc_PlayerFace = playerFace_mc;
            enemyAttackEffect = attackEffect_mc;
            mc_playerHitBox = playerHitBox_mc;

            function onFrame(e:Event):void
            {
                battler1_mc.gotoAndStop(battler1);
                battler2_mc.gotoAndStop(battler2);
                battler3_mc.gotoAndStop(battler3);

                if (Game.playerInteractionStatus[1])
                {
                    //we are fighting
                    visible = true;
                    if (attackEffect_mc.hitTestObject(playerHitBox_mc))
                    {
                        // attack hit us, deal dmg
                        dmgReduction = (Game.playerStats[2] * (Game.enemyStats[1]));
                        dmgDealt = Game.enemyStats[1] - dmgReduction;
                        attackEffect_mc.x = 516;
                        if (Game.playerStats[0] - Math.round(dmgDealt) <= 0)
                        {
                            // round dmg to 0 (were dead)
                            Game.playerStats[0] = 0;

                        }
                        else
                        {
                            // deal damage to us
                            Game.playerStats[0] -=  Math.round(dmgDealt);
                        }
                    }
                    else if(attackEffect_mc.hitTestObject(wall))
                    {
                        //stop the player from moving (by doing nothing)
                    }
                    else
                    {
                        attackEffect_mc.x -=  dmgSpeed;
                    }
                }
                else
                {
                    // reset the position of the attack effect if we are not fighting
                    visible = false;
                    attackEffect_mc.x = 516;
                }
            }
        }
    }
}

这个Event.ENTER_FRAME的例子是实际上很复杂的少数几个之一,其他Event.ENTER_FRAME倾向于简单地更新值(例如:更新文本字段以显示正确的数字变量)

  

例如:在enterframe中创建多个vars可能会阻塞   记忆和造成滞后。

我避免做这样的事情,不仅仅是你所说的,但在我看来,我认为在函数中连续定义它是没有意义的,我只更新这些值。

资源

http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-8000.html

允许最大链接

0 个答案:

没有答案