0

とりわけ、ユーザーが写真を保存できるようにする iPhone アプリがあります。新しい写真がアプリのデータ ストアに追加されると、写真のサムネイル グリッドが適切な時間内に読み込まれるように、画像のサムネイル バージョンをキャッシュします。

問題は、これらのサムネイルが Retina ディスプレイ以前の画面では見栄えがよくても、RD ディスプレイでは少しぼやけて見えることです。画像が使用できないことはそれほど悪いことではありませんが、アプリの古いバージョンで保存された画像のユーザーが Retina ディスプレイの利点を最大限に活用できるようにしたいと考えています。

問題は、これらすべてのサムネイルを再作成するには時間がかかりすぎることです。私のテストでは、iPhone 4 でサンプル データベースを高解像度のサムネイル (確かに大きなもの) に再エンコードするのに約 1 分半かかりました。古いハードウェアではさらに悪化します。

どうすればこれを回避できますか? 上記のパフォーマンス結果を考えると、1 回限りの移行は問題外のようです。他のオプションでは、サムネイルを遅延して (つまり、画面に表示されるときに) 縮小し、その時点でデータベースに保存します。古い画像でいっぱいの画面は、最初に見たときは動きが鈍くなり、その後はきびきびと動きます。

考慮すべき他のアプローチはありますか?他の誰かがこの問題に直面しましたか?

4

2 に答える 2

0
  1. 画像を変換しようとする考えは好きではありません。
  2. ユーザーはすぐに焦り、アプリにバグがあり、読み込みに時間がかかると言うでしょう。
  3. フルサイズの画像を再処理せずに状況を解決すると思います。
  4. 古いハードウェアでは、Retina ディスプレイはありません (画像をアップサイズする必要はありません)。Retina ディスプレイを使用している場合は、高速の iPhone iPod を使用しています。

サムネイル画像を表示する方法で問題をグラフィカルに解決することをお勧めします。フルスクリーンの代わりに、この画像の周りに境界線を置き、実際の解像度で表示します (アップスケールしないでください)。または、通常は 1 つを表示する場所に 4 つの画像を表示します (iPhone の画面は 4 倍の解像度であるため)。

元の大規模な画像をリサンプリングする代わりに、サムネイルのバイキュービック アップサンプルを実行して、サイズを 4 倍にすることができます。これにより、少しぼやけますが、見た目が非常に悪い iPhone のスケーリングよりも見栄えが良くなるはずです。アップサンプルは、小さな画像で動作するため、超高速です。

アップサンプリングについてはお手伝いできませんが、どこかにコードがあります。

乾杯、ジョン。

于 2010-11-23T02:46:38.313 に答える
-1

古い画像でいっぱいの画面は、最初に見たときは動きが鈍くなり、その後はきびきびと動きます。

鈍くする必要はありません。

少し面倒ですが、ほとんどの処理はバックグラウンド スレッドで行うことができます。UI が遅くなりすぎないように、スレッドの優先度を低い値 (0.1 など) に設定します。これを行う最も簡単な方法は、変換する必要がある各画像に対して NSOperation を設定し、それらを maxConcurrentOperationCount=1 で NSOperationQueue に追加することです。

書き込みがアトミックでない場合は、-applicationDidEnterBackground: または -applicationWillTerminate: (または対応する通知通知をリッスンするもの) で、次のようにし[queue cancelAllOperations]; for (NSOperation * operation in queue) { [operation setThreadPriority:1]; } [queue waitUntilAllOperationsAreFinished];ます。約 10 秒ほどかかりますが、これは画像変換がディスクへの書き込みを完了するのに十分なはずです (したがって、半分書き込まれたファイルを回避できます)。保護を強化するため[operation isCancelled]に、10 秒以上かかる可能性がある場合は、書き込みの直前に確認してください。明らかに、-applicationWillEnterForeground: では、変換を再開する必要があります (一部の画像は既に変換されていることに注意してください)。

並行性の問題は追跡するのが楽しいです...

(それだけでは十分ではないことに注意してください[data writeToFile:path atomically:YES]。書き込み中にアプリが強制終了された場合、一時ファイルがそのまま残る可能性があります。可能であればコア データにサムネイルを保存することをお勧めしますが、それは既存のアプリでは問題外になる可能性があります。 )

于 2010-11-23T03:55:58.047 に答える