モバイル デバイス用のビットマップ エディタ (Photoshop の限定バージョン) を作成しようとしています。ユーザーのドキュメントは、それぞれのサイズが約 1000x500 の ~4 ビットマップで構成されています。
できる限りシンプルで、堅牢で効率的な取り消し/やり直しシステムが必要です。編集を元に戻したりやり直したりするのに約 0.2 秒かかることを目指しています。現在意図しているアプローチに関するフィードバック、または使用できる新しいアイデアを探しています。私が持っているものは複雑すぎると思うので、先に進むことに慎重です.
元に戻す/やり直しシステムに Command パターンと Memento パターンを組み合わせて使用して実験しました。これまでに私が到達したいくつかの結論は次のとおりです。
十分なメモリがなく、多くの状況で前のコマンドの「実行しない」操作をサポートするメメントを使用するのに十分な速さでメモリをディスクに書き込むことができません。ユーザーが保存されるのを待たずに、ユーザーが塗りつぶしたものを表すビットマップを保存できるようにします。
ドキュメントを初期状態に復元し、最後のコマンドを除いてすべてのコマンドを再生して元に戻すと、10 回のペイント ストロークまたは 5 回のスマッジ ストロークの再生など、わずかな数のコマンドを実行しても非常に遅くなります。遅い。
バックグラウンドでドキュメント全体を定期的にディスクに保存し、コマンドを再生する前にこのチェックポイントに復元することで、前のポイントを回避できます。最後のチェックポイントよりも前に元に戻すには、この前のチェックポイントをリロードして、コマンドを再生します。
アプローチ 2 と 3 は問題なく動作しますが、レイヤーが追加されるにつれてドキュメント全体の保存がますます遅くなり、4 つのビットマップで既に遅くなります (約 5 ~ 10 秒待機)。したがって、前回から変更されたものだけを保存するように、3 を変更する必要があります。
多くのコマンドは 1 つのレイヤーのみで動作するため、最後のチェックポイント以降に変更されたレイヤーのみを保存するのが理にかなっています。たとえば、チェックポイントを保存する場所を指定した 3 つの初期レイヤーがある場合、コマンド スタックは次のようになります。
(Checkpoint1: Save layer 1, 2 and 3.)
Paint on layer 1
Paint on layer 1
(Checkpoint2: Save layer 1. Reuse saved layers 2 and 3 from Checkpoint1.)
Paint on layer 2
Paint on layer 2
(Checkpoint3: Save layer 2. Reuse saved layers 1 and 3 from Checkpoint2.)
Paint on layer 3
Paint on layer 3
Flip layer 3 horizontally.
(Checkpoint4: Save layer 3. Reuse saved layers 1 and 2 from Checkpoint3.)
Resize layer 1, 2 and 3.
(Checkpoint5: Save layer 1, 2, 3.)
編集中は、前回のチェックポイント以降に変更されたレイヤーを追跡します。チェックポイントを復元するときは、変更されたレイヤーのみを復元します。たとえば、レイヤー 2 と 3 を変更した後にチェックポイント 4 を復元するには、ディスクからレイヤー 2 と 3 のバックアップをリロードします。チェックポイントを追加するときは、それまでに変更したレイヤーのみを保存します。一度にメモリに保持できるレイヤーの一時コピーは約 1 つだけであるため、ユーザーがチェックポイントが保存されるのを待たなければならないインターフェイスの場所が必要な場合を除いて、これらすべてをほぼ自動化できます。
どう思いますか?私が望んでいるよりもはるかに複雑ですが、他に方法がありません。生活を楽にするために使用できる他の便利なパターンはありますか?