4

switch ステートメントを含む while ループがあります。

while(true) {
        switch(state) {
        case LOADING :
            //THIS IS THE IMPORTANT PART
            //view loading screen (already set by default)
            contentPane.repaint();
            if(tick == 400000) {
                //state = GameState.MENU;
                System.out.println("Reached " + gameTick);
            }
            break;
        case MENU :
            //view menu
            break;
        //some other cases without content, left them out here
        }
        tick++;
        if(tick < 400000) {
                System.out.println(tick);
        }
        if(tick == Long.MAX_VALUE) {
            tick = 0;
        }
    }

これで、このコードは正常に実行され、ロード画面が表示され (再描画が繰り返し呼び出されている間はドットが移動するため、いつ停止するかが正確にわかります)、出力は 1 から 400000 までカウントされ、その数がカウントされます。版画

399998
399999
Reached 400000    

(出力の最後の 3 行)

アプリケーションがフルスクリーンになり、Alt+Tab キーを押すと、カウンターは通常 130K 前後で、400K に移動します。

ただし、この番号を出力する if ステートメントを削除すると、次のようになります。

if(tick < 400000) {
    System.out.println(tick);
}

ローディング画面は動かず、Alt + Tab キーを押すと、すでに 400K に達しています。

また、興味深いことに、ロード画面には 3 つの「外観の変更」があります。1 つは paintComponent メソッドの 100 回の呼び出しで、もう 1 つは 200 回の呼び出しで、もう 1 つは 300 回の呼び出しで、カウンターを 0 にリセットします。外観の変化。最初のケースでは、実行時間が長い if ステートメントを使用すると、変更が見られますが、期待したほど頻繁ではありません。2 番目のケースでは、それらがまったく表示されません (発生が速すぎると想像できます)。

私の質問は、実行時間にこの非常に大きな違いが生じる理由と、paintComponent メソッドが呼び出されるように見える回数と、ループが反復される 400.000 回の違いの原因は何ですか?

すべてのアイデアが高く評価されました。

4

5 に答える 5

5

コンソール、特にMS-DOSコンソールへの書き込みは非常に遅いです。コンソールに書き込む行数を最小限に抑えるようにしてください。大量のデータを書き込む必要がある場合は、ファイルに書き込むことをお勧めします。これは、大幅に高速化できるためです。

これは別のスレッドで行われ、GUIスレッドを拘束していないと思います。

于 2012-10-03T14:40:37.610 に答える
2

このrepaint()メソッドは、コンポーネントをすぐに再描画するのではなく、AWT/Swingシステムにコンポーネントを再描画するように通知するだけです。したがって、repaint()10回高速で呼び出すと、1回だけ再描画される可能性が高くなります。

ここで、ループを見ると、時間がかかることは何もありません(repaint()再描画しないことに注意してください)。ループに呼び出しを追加するSystem.out.println()と、ループ内で実行する作業が大幅に増加します。

于 2012-10-03T14:42:09.493 に答える
1

どんな種類のインターフェースも、インターフェースなしで行うよりも何倍も遅くなります。コンソールでもグラフィカル インターフェイスでも構いません。これは主に、グラフィカル デバイスにアクセスするために必要なすべての余分なコードが原因です。ハードウェアの遅延は言うまでもありません。

于 2012-10-03T14:52:47.700 に答える
1

コンソールへの書き込みは、特に何もしない場合と比べて、比較的時間がかかる作業です。これにより、実行が大幅に遅くなります。出力をファイルにリダイレクトすると、ループは印刷しない場合よりも遅くなりますが、コンソールに印刷する場合よりも速くなります。

これが、印刷ありとなしで実行速度に大きな差が出る原因です。

于 2012-10-03T14:42:38.313 に答える
1

のようなものを試してください、

tick++;
Thread.sleep(100);

想定される変更が発生しているかどうかを確認します。

于 2012-10-03T14:43:15.270 に答える