1

ゲームには最大 10000 個のオブジェクトがあり、マウスが動かされていないときは正確に 60 (最大) FPS です。しかし、円を描くようにマウスを動かし始めると、FPS は平均 45 で 30 に到達しようとします。マウスを止めると、即座に 60 になります (プログラムがハートビートを失ったため)。SWF は、ブラウザなしでスタンドアロンで実行されます。

MouseEvent.MOUSE_MOVEリスナーをすべて削除し、メイン クラスのmouseEnabled=falseとを作成しました。mouseChildren=false

FPS を 12 から 60 に 1 つずつ増やしました。生まれた各フレームに名前を付けましたが、そのうちの 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;
        } );
    }
}
4

1 に答える 1

1

あなたはおそらくより現代的な問題に移ったでしょうが、私は最近この問題に自分自身で苦労しました.

古いスタイルのボタンに対する従来のサポートが原因であることが判明しました。優れた Scout プロファイリング ツールに関するAdob​​e のチュートリアルからの引用:

「Flash Player には、古いスタイルのボタン オブジェクト (Flash Professional で作成するようなもの) を処理するための特別なコードがあります。マウス イベントの ActionScript イベント ハンドラーを探すのとは別に、マウスが動くたびにこれらのボタンの表示リストを検索します。 。表示リストに多数のオブジェクトがある場合、これはコストがかかる可能性があります。残念ながら、この操作は古いスタイルのボタン オブジェクトを使用していない場合でも発生しますが、Adobe はこの問題の修正に取り組んでいます。」

アドビはこれを修正することに実際に取り組まなかったことが判明したためDisplayObjects、マウスが移動している間、多数のエラーが FPS に大混乱をもたらします。唯一の修正は、たとえば、Graphics. 私の初期のテストでは、設定mouseEnabled = falseも実際の効果はないようです。

于 2016-08-16T18:20:13.663 に答える