ユーザーが写真を撮ってから「スクラブ」できる画像アプリに取り組んでいます。スクラバーは UISlider であり、ユーザーが親指を左から右に動かすと、保存された画像が全画面表示されます。何百もの画像が存在する可能性があり、スクラビング エクスペリエンスに遅延がないようにしたいと考えています。
これまでのところ、これが私がやったことです。これらのいずれかが最も効率的ではないことがわかっている場合は、教えてください。
1) 各写真の低解像度 (約 40% 品質) JPEG バージョンを別の DB テーブル PhotoLowQuality に保存します。それらをファイルとして保存し、データベースに filePath を入れるだけの方がよいと聞きましたか? コードの 1 つのブランチに既にある高解像度の画像でそれを行いますが、パフォーマンスの違いはまだテストしていません。
2) 現在、フル解像度の写真を 85% JPEG として保存し、サイズを約 1.5 メガピクセル (1500x1000) に変更しています (iPhone の画面は 1 MP でさえないため)。拡大できるように少し余裕を残していますが、このタイプのアプリにはそれほど多くは必要ありません。
3) ユーザーが写真をスクラブし、処理が速い場合 (たとえば、最後の写真が 0.1 秒以内に表示された場合)、最初に低品質バージョンを提供し、高品質バージョンの写真をプルするタイマーを開始します。 0.1秒後と言います。ユーザーがスクロールし続けると、低バージョンの写真が表示され (違いはほとんどわかりません)、速度が十分に低下するか停止するとすぐに、フル解像度の写真がほぼ瞬時に表示されます。
4) NSCache で写真をキャッシュしますが、最初のパススルーの後ではなく、すぐに 30 以上の FPS が必要です。さらに、NSCache は、ドキュメントに記載されているにもかかわらず、メモリ不足の状態で十分な速度でメモリを解放しないため、アプリをクラッシュさせることがあることに気付きました。
写真を読むには、次を使用します。
[UIImage imageWithContentsOfFile:photoCoreDataEntity.filename];
これは iPhone 5 では非常にスムーズに動作します。iPhone 4 ではそれほどでもありません。マルチスレッドはまだありません。最適な方法を見つけようとしています。たとえば、すべての画像読み取り要求を NSOperation に入れるとします。 、ユーザーが次の写真にスクラブしたときに前の操作をキャンセルできますが、これからの読み取りの途中でキャンセルするか、読み取りが完了するまで待つので、アイデア全体が無意味になりますか? たぶん、バイトを自分でストリームとして読み取り、定期的にキャンセルフラグをチェックする必要があります...
この問題を解決するための助けをいただければ幸いです。ありがとうございました