1

私はクラスのために小さなテキストベースのゲームを書いています。ナビゲーションはシンプルで、プレーヤーはボタンをクリックして別の部分に入ることができます。これらの部分はすべて、独自のコードブロックに分割されています。これまでに設定したパーツは2つだけで、それぞれがボタンを介して相互にアクセスできます。基本的に:

private void level1() {
//Stuff here, player clicks a button which runs "level2();"
}

private void level2() {
//Stuff here, player clicks a button which runs "level1();"
}

これで問題なく動作しますが、1と2の間を何度かクリックすると、プログラムの実行が非常に遅くなります。タスクマネージャは、約700MBのメモリ使用量を報告します。

私が欠けていることは本当に明白な何かがあると確信しています。ユーザーが多くのボタンを何度もクリックでき、プログラムにそれほど多くのリソースを使用させない方法を探しています。助けていただければ幸いです。

編集:もう少しコード。Choice1-3はボタンの名前です。変数はプログラムの先頭ですでに宣言されており、初期化部分で設定されています。これらは、Scene1や2などのコードの各ブロックで変更されます。

private void setScene1() // TITLE SCREEN
{
    TITLE.setText("Title Label");
    main.setText("Main text body for the game.");
    choice1.setText("Play");
    choice1.setBounds(10, 600, 996, 91); // This makes choice1 as large as
                                            // all three buttons combined.
    choice2.setEnabled(false);// There's only one option anyway.
    choice3.setEnabled(false);
    choice2.setVisible(false);
    choice3.setVisible(false);

    choice1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            setScene2();
        }
    });

}

private void setScene2() // CHARACTER GENERATION SCENE
{
    TITLE.setText("Character Generation");
    main.setEnabled(false); // Disable & Hide the main text window, as
                            // Chargen requires a nicer looking interface.
    main.setVisible(false);
    choice2.setEnabled(true);
    choice2.setVisible(true);
    choice1.setBounds(10, 600, 996, 34); //Resizing the bottom portion to fit two buttons
    choice2.setBounds(10, 645, 996, 34);
    choice1.setText("Continue");
    choice1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            // Nothing here for now
        }
    });
    choice2.setText("Back to the Title Screen");
    choice2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            main.setEnabled(true);
            main.setVisible(true);
            setScene1();
        }
    });

}
4

3 に答える 3

2

問題は、シーンを切り替えるたびに ActionListener を追加しているという事実にあるようです。以前の ActionListener が消えることはありませんが、同じことを行うその上にさらにスタックしています。それぞれが同じアクションを実行するため、 を押してシーンを切り替えると、現在持っているすべての ActionListner もシーンを切り替えます。2^n 個の ActionListeners が入力を待っており、その数がメモリ内に存在するため、CPU が上昇します。

于 2013-01-11T22:09:20.233 に答える
2

2 つのメソッドが互いに呼び出し続けると、最終的にはメモリを食い尽くすことになります。これが再帰です。コール ツリーを元に戻さないと、ブームになるまで勝手に深くなります。

于 2013-01-11T21:51:33.630 に答える
1

コンストラクターまたは他の場所に ActionListeners を追加する必要があります。このようにして、ボタンを押すたびに (同じであっても) 新しい ActionListener を追加します。

于 2013-01-11T22:09:06.850 に答える