2011-01-18 2 views
2

私はモバイルデバイス用のフォトショップのようなプログラムを書いています。私はレイヤーの使用をサポートしたいと思います。ほとんどの場合、私は一度に約7ビットマップをメモリに格納することができます。私は、多くのメモリを使わずにたくさんのレイヤー(例えば、10または20)をサポートする方法を考え出すことができるかどうかを確認しようとしています。イメージエディタで多数のレイヤをサポートしていますか?

私の現在の考えは次のとおりです。ユーザーは、現在のペイントして操作することができ、活性層として

  • 使用1つのビットマップ。
  • アクティブレイヤの下にあるすべてのレイヤのフラット化バージョンを格納する1つのビットマップを使用します。
  • アクティブレイヤの上にあるすべてのレイヤのフラット化されたバージョンを格納する1つのビットマップを使用します。

レイヤーがアクティブレイヤーでない場合は、ディスクに書き込んでメモリから削除できます。ユーザーがアクティブなレイヤーを切り替えると、ディスクからレイヤーを取得し、フラット化されたイメージを再作成します。

このアイデアは、各レイヤーに不透明度設定がある場合にのみ表示されますが、レイヤーが画面や掛け算などの異なるブレンドモードを持つことができるとは思われません。平坦化されたボトムレイヤーは正常に動作しますが、いずれかのレイヤーがブレンドモードを使用し、アクティブレイヤーが変更された場合、すべてのトップレイヤーを再度レンダーする必要があるようです。

どのようなアプローチを使用できますか?私は、100以上のレイヤーをサポートする様々なペイントプログラムを見てきました。そこで、いくつかのトリックが必要です。

答えて

0

レイヤーが単純な不透明度を持っている場合は、すでに合理的なアプローチを取っていると思いますが、ブレンドモードが異なると問題が見えます。

画像をサブブロックにチョップする方法があります。 32x32のサイズで、何かが変更されたものだけを再ブレンドします。メインメモリにサブブロックのキャッシュを並べることができます。そのため、ユーザーが小さな領域だけを編集している場合は、ほとんどの時間に必要なデータがあります。それは複雑ですが、潜在的にパフォーマンスを向上させるために不透明度ブレンディングだけを必要とする連続したレイヤーを維持できます。

Photoshopは少なくともこれを行うために使用されていたことを覚えているようです。階層を持っていたかもしれませんが、イメージは分割されたブロックでした。

+0

ありがとう、それは考慮すべき興味深い考えです! – rbcc