AS3:由于无辜的鼠标移动,FPS显着下降

时间:2013-09-15 22:56:54

标签: performance actionscript-3 frame-rate

我的游戏中有大约10000个物体,当鼠标移动时,我只有60(最大)FPS。但是当你开始在圆圈中移动鼠标时,FPS会尝试在45处达到30的平均值。当你停止鼠标时它会立即变为60(因为程序失去了它的心跳)。 SWF是独立运行的 - 没有任何浏览器。

我删除了所有MouseEvent.MOUSE_MOVE个侦听器,并为主要课程制作了mouseEnabled=falsemouseChildren=false

我将FPS从12点逐一增加到60点 - 我给出生的每一帧画了名字,看着其中15个因为什么都没死而真的很痛苦......

示例代码:

public class Main extends Sprite
{
    private var _periods : int = 0;

    /** Idling FPS is 23. Move mouse to drop FPS to 21.*/
    public function Main() : void
    {
        //true if need to drop FPS to 18 instead of 21 moving mouse:
        const readyToKill2MoreFrames : Boolean = true;
        if ( readyToKill2MoreFrames )
        {
            var ellipse : Sprite = new Sprite;
            ellipse.graphics.beginFill( 0x00FF00 );
            ellipse.graphics.drawEllipse( 300, 300, 400, 200 );
            ellipse.graphics.endFill();
            addChild( ellipse );

            //uncomment to fall only to 21 instead of 18:
            /*ellipse.mouseChildren = false;
            ellipse.mouseEnabled = false;*/
        }

        var fps : TextField = new TextField;
        //uncommenting doesn't change FPS:
        //fps.mouseEnabled = false;
        addChild( fps );
        fps.text = "???";
        fps.scaleX = fps.scaleY = 3;
        var timer : Timer = new Timer( 1000 );
        timer.addEventListener( TimerEvent.TIMER, function( ... args ) : void
        {
            fps.text = _periods.toString();
            _periods = 0;
        } );
        timer.start();

        addEventListener( Event.ENTER_FRAME, function( ... args ) : void
        {
            //seems like PC is too fast to demonstrate mouse movement
            // drawbacks when he has nothing else to do, so let's make
            // his attention flow:
            for ( var i : int = 0; i < 500000; ++i )
            {
                var j : int = 2 + 2;
            }

            ++_periods;
        } );
    }
}

1 个答案:

答案 0 :(得分:1)

你可能已经转向了更现代的问题,但我最近自己也在努力解决这个问题,所以这里有一个答案,可以解决未来不幸遇到的问题。十年之久的罪过。

事实证明,对旧式按钮的传统支持是罪魁祸首。在优秀的Scout分析工具上引用Adobe的tutorial

  

&#34; Flash Player有一些特殊代码来处理旧式按钮对象(您在Flash Professional中创建的那种)。   独立于查找鼠标的ActionScript事件处理程序   事件,它会在显示列表中搜索任何这些按钮   鼠标移动。如果您有大量的,这可能会很昂贵   显示列表上的对象。不幸的是,这个操作发生了   即使你不使用旧式按钮对象,但Adobe正在工作   解决这个问题。&#34;

原来Adobe从来没有真正解决这个问题,所以任何大量的DisplayObjects都会在鼠标移动时对你的FPS造成严重破坏。唯一的解决方法是以某种方式合并它们,例如通过使用Graphics批量绘制它们。在我的早期测试中,似乎设置mouseEnabled = false也没有实际效果。