0

オブジェクト (ゲームのモデル/データ) をディスクに保存したいのですが、ゲームが非常に大きくなる可能性があるため (いくつかのゲーム ティックを格納するのに十分な大きさになる可能性があります)、別の場所に保存するのが理にかなっていると考えています。ゲームを比較的スムーズに実行し続けるためのスレッド。

これを達成するための最良の方法は何ですか?GameState (モデル) を実行可能にするか、スレッドの拡張にすることが理にかなっているかどうかはわかりませんでした。ほとんどの場合、実行可能にすることを意図していないためです。論理的には、実行可能にするべきではありませんか?

私が調べた他の可能性は、GameState または GameState のコピーを渡す Runnable GameSaver クラスを持つことです。ただし、これにより、GameState を渡すと同期に問題が発生したり、クラスのクローン作成中にゲームの速度が低下したりする可能性があります。

最良のアプローチ、またはアプローチの長所と短所は何ですか? 他の代替手段も評価されました-私の検索が網羅的であったとは思えません.

4

1 に答える 1

2

純粋なスレッド管理の観点から、私が考える最もクリーンな方法は、エグゼキュータを使用することです。それはあなたのクローン作成(またはそうでない)問題を解決しません。

ゲームを保存するメソッドを作成します。

public void saveTheGame() {
    //you maybe need to take a snapshot, which might require synchronization
    GameState state = ....;
}

たとえば、クラスインスタンスメンバーとして、その呼び出しとエグゼキュータサービスを埋め込むランナブルを作成します。

private final Runnable save = new Runnable() {
    public void run() {
        saveTheGame();
    }
}
private final ExecutorService executor = Executors.newFixedThreadPool(1);

そして、必要に応じてゲームを保存します。

executor.submit(save);

アプリを閉じるときは、エグゼキュータをシャットダウンすることを忘れないでください。

executor.shutdown();

ScheduledExecutorServiceたとえば、x分ごとに実行される代わりに使用することもできます。

クラスは次のようになります。例:

public static class GameSaver {
    private final Runnable save = new Runnable() {

        @Override
        public void run() {
            saveGame();
        }
    };
    private static final ExecutorService executor = Executors.newFixedThreadPool(1);
    private final GameState state;

    public GameSaver(GameState state) {
        this.state = state;
    }

    public void save() {
        executor.submit(save);
    }

    public static void close() {
        executor.shutdown();
    }

    private void saveGame() {
        //save your game here
    }

}

そしてあなたのメインコードで:

GameState state = getGameState();
GameSaver saver = new GameSaver(state);
saver.save();
于 2012-04-17T23:08:12.123 に答える