5

テキストをわかりやすくするために、解像度が(2000 x 2000)より高い画像を使用する必要があるアプリを開発しています。

背景画像があり、その上に同じ解像度のオーバーレイ画像を表示する必要があります。オーバーレイの数は2から30まで可変です。

UIImageを使用して画像を読み込む場合、ピクセルごとに4バイトかかるため、1つの画像の解像度が3000x3000の場合、最大34 MBのメモリ、2000x2000の場合は15MBが必要になります。

ここで問題が発生し、3GSで4〜5枚の画像、iPhone 4で11〜13枚の画像を読み込んだ後にアプリがクラッシュします。

オーバーレイは、背景画像の上に正確に配置する必要があります。これらは、Googleマップのトラフィックオーバーレイにあるものとまったく同じです。これはタイリングを除外するものではありませんが、タスクを比較的複雑にします。

この問題をどのように処理する必要がありますか?

4

1 に答える 1

0

確かに、画像セット全体を一度にメモリにロードすることはできません。画像データの表示部分のみをロードする必要があり、非表示部分をできるだけ速くアンロードする必要があります。

QuartzCoreレベルでこれを解決したい場合はCATiledLayer、この目的のためだけのクラスがあります。

アップルリファレンス:https ://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html

Appleサンプルコード:https ://developer.apple.com/library/mac/#samplecode/CALayerEssentials/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008029

追加情報: http: //red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/

このレイヤーを使用するには、ソース画像を多くのタイルに分割する必要があります。そして、レイヤーがそれを必要とするときにそれらを供給します。(drawLayer:inContext:メソッド。)メソッドは非メインスレッドで呼び出されるため、ユーザーインターフェイスがブロックされることはありません。メモリを節約するために、非表示のタイルの画像を解放することを忘れないでください。

また、バックグラウンドスレッドを使用して動的なリソースの読み込みを行う低レベルのOpenGLコードでこれを実装できます。この場合、PVRTCの不可逆のメモリ内圧縮を使用して、ビデオメモリの使用量を大幅に節約できますが、これは非常に面倒で時間のかかる作業です。の使用をお勧めしCATiledLayerます。ほとんどの場合、これで十分です。

于 2012-10-01T18:55:35.040 に答える