レイヤーを使用できる2D描画用の簡単なアプリケーションを開発しています。さまざまなプラットフォーム (.NET、Java、QT...) を試しましたが、常に同じ問題に遭遇します。特にキャンバス (グラフィック データを格納する各オブジェクト) のサイズが大きい場合 (3000x3000 ピクセル程度)、すべてのグラフィック レイヤー/画像/ビットマップを効率的にメモリに格納する方法がわかりません。すべてのレイヤーをイメージ/ビットマップ オブジェクト (または、まだ大量のメモリを消費する任意の種類のカラー データ配列) として保存する以外に方法はないと思います。
私がすでに試したこと:
- すべてのレイヤ オブジェクトを直接メモリに格納します。これらのオブジェクトにすばやくアクセスできますが、キャンバス サイズが大きすぎてレイヤー オブジェクトが多数ある場合、メモリ使用量のオーバーフローによりプログラムがクラッシュすることがよくあります。
- 他のすべてのレイヤーをハード ドライブにキャッシュしたまま、「アクティブな」レイヤー オブジェクトのみをメモリに格納します。しかし、ユーザーがストロークを描画して新しい最終的な「可視」画像を再構築するたびに、すべてのレイヤーオブジェクトにアクセスする必要があります。また、ハード ドライブからすべてのキャッシュされたレイヤー オブジェクトにアクセスすると、非常に遅くなります。これは、すべてのレイヤー オブジェクトを 1 つずつメモリに再度割り当ててから、それらを強制終了する必要があるためです。
- すべてのレイヤー オブジェクトのグラフィック データを圧縮し、メモリに格納します。しかし、繰り返しになりますが、最終的な可視画像を再構築する必要があるたびに、グラフィック データを 1 つずつ解凍する必要がある場合、それも非常に遅くなります。
では、大量のグラフィック オブジェクトを格納する正しい方法は何でしょうか? Photoshop のような一般的なソフトウェアは、どのようにして多くの大きなレイヤーを処理しながら高速に動作できるのでしょうか? 誰か知っていますか?
- - 解決 - -
わかった!イビルラフのおかげで、私はこれを解決しました。キャッシュされたファイルからレイヤーの必要な小さなスライスを読み取ると、レイヤー全体を割り当てようとする場合よりもメモリ割り当てがはるかに速く進むようです。
これが私がしたことです:
- レイヤーオブジェクトの初期化時に、ハードドライブにゼロバイト (透明ピクセル) で満たされた新しいファイルを作成します。そうすれば、レイヤーのグラフィックデータはメモリに保存されません。
- レイヤー オブジェクトからビットマップ/イメージ スライスを取得する必要がある場合は、スライス領域の座標を渡します。レイヤーオブジェクトのメソッドは、新しい空のビットマップ/イメージを作成し、その「ビット」をキャッシュされたファイルのデータに置き換えます。領域に応じた正しいストライドと位置から始めます。
- ビットマップ/イメージを使用したすべての操作が完了したら、キャッシュされたファイルをビットマップ/イメージの新しい「ビット」で更新する別のレイヤー オブジェクトのメソッドにそれを渡します。その後、メモリからビットマップ/イメージをフラッシュします。
非常に高速に動作し、メモリに割り当てられた可視ビットマップ/画像は 1 つだけです。
悪い面: すべてのレイヤーのキャッシュ ファイルは依然としてハード ドライブのスペースを占有します。しかし、誰もが大容量のハードドライブを持っている今日、それは重要ではありません。