12

モバイル デバイス用のビットマップ エディタ (Photoshop の限定バージョン) を作成しようとしています。ユーザーのドキュメントは、それぞれのサイズが約 1000x500 の ~4 ビットマップで構成されています。

できる限りシンプルで、堅牢で効率的な取り消し/やり直しシステムが必要です。編集を元に戻したりやり直したりするのに約 0.2 秒かかることを目指しています。現在意図しているアプローチに関するフィードバック、または使用できる新しいアイデアを探しています。私が持っているものは複雑すぎると思うので、先に進むことに慎重です.

元に戻す/やり直しシステムに Command パターンと Memento パターンを組み合わせて使用​​して実験しました。これまでに私が到達したいくつかの結論は次のとおりです。

  1. 十分なメモリがなく、多くの状況で前のコマンドの「実行しない」操作をサポートするメメントを使用するのに十分な速さでメモリをディスクに書き込むことができません。ユーザーが保存されるのを待たずに、ユーザーが塗りつぶしたものを表すビットマップを保存できるようにします。

  2. ドキュメントを初期状態に復元し、最後のコマンドを除いてすべてのコマンドを再生して元に戻すと、10 回のペイント ストロークまたは 5 回のスマッジ ストロークの再生など、わずかな数のコマンドを実行しても非常に遅くなります。遅い。

  3. バックグラウンドでドキュメント全体を定期的にディスクに保存し、コマンドを再生する前にこのチェックポイントに復元することで、前のポイントを回避できます。最後のチェックポイントよりも前に元に戻すには、この前のチェックポイントをリロードして、コマンドを再生します。

アプローチ 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 つだけであるため、ユーザーがチェックポイントが保存されるのを待たなければならないインターフェイスの場所が必要な場合を除いて、これらすべてをほぼ自動化できます。

どう思いますか?私が望んでいるよりもはるかに複雑ですが、他に方法がありません。生活を楽にするために使用できる他の便利なパターンはありますか?

4

2 に答える 2

1

以下は、画像を使用するレイヤーとアンドゥ バッファーに便利な場合があります。

  • 最新の画像を画像として保持
  • 以前のバージョンは、次のバージョンとの xor として保存され、(すべてが同じ方法で変更または変更されたわけではないと仮定して) 単純な圧縮アルゴリズム (ランレングス エンコーディングなど) を使用して圧縮されます。

これには次の利点があります

  • 以前のバージョンは簡単にマージできます (xor を一緒に)。

これは、次の場合にはうまく機能しない可能性があります。

  • 色の調整(色合い、明るさなど)
  • 座標変換 (クロップ、モーフィングなど)
于 2010-10-10T21:25:02.633 に答える
1

1 つのアプローチは、特定の「フレーム」を完全なフレームとして保持し、他のフレームを前のフレームからフレームを作成するために必要なコマンドとして保持することです。あなたは#2でこれをほのめかしています。一部のフレームをメモリに保持しておくと役立つ場合があります。

完全なフレームを保持するために利用できるスペース/時間とパフォーマンスのバランスをとるのに役立つかもしれないトリックは、「古い」フレームの一部を破棄することです。 8、16、32、および 64 操作前。1 つまたは 2 つの操作を元に戻すには、フレームを読み取るだけで済みます。3 つ元に戻すには、チェックポイントを読み取って 1 つの操作を繰り返す必要があります。5 回元に戻すには、チェックポイントを読み取り、3 回の操作を繰り返す必要があります。33 回元に戻すには、チェックポイントを読み取って 31 回の操作を繰り返す必要があります。

アプリケーションのスムーズさを向上させるために、元に戻す操作中にバックグラウンドでチェックポイント フレームを再計算すると役立つ場合があります。たとえば、17 回の操作を元に戻した後、開始点から 48、40、および 36 ステップさかのぼって状態の計算をバックグラウンドで開始する可能性があります。作品。1、2、4、8、または 16 回前の操作であったフレームは、現在の状態から順方向にコマンドを再生することで再作成できるため、破棄できることに注意してください。

于 2011-03-17T22:25:11.097 に答える