2

次のコードを使用して、多数の UIImages (ローカルでアプリにプリロードされている) をロードしています。

NSString*plistPath = [[NSBundle mainBundle] pathForResource:@"images" ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:plistPath];
NSMutableArray *finalArray = [[NSMutableArray alloc] initWithCapacity:array.count];
for(int i=0;i<array.count; i++) {
    [finalArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%@",[array objectAtIndex:i]]]];
}

その後、collectionView で:

cell.cellImage.image = [finalArray objectAtIndex:indexPath.row];

そのcollectionViewの表示には大きな遅れがあります。次のインストゥルメントのスクリーンショットでその遅れをキャプチャしました。

ここに画像の説明を入力

その遅延 (ユーザーが経験し、グラフに示されている) と、以下の実際の呼び出しツリーの間に大きな断絶があり、遅延は示されていません。collectionView の各セルに 500k jpg をロードしています。このインスツルメンツの分析は基本的に、コードでできることは何もないと言っているのですか。これはシステム ライブラリの遅延ですか?

編集: 私の質問は、私の collectionView を使用したこの特定の使用例に関するものではなくなりました。楽器全般についてです。スクリーンショットで行っているオプションを選択していて、アプリが大幅な遅延を示しているのに時間プロファイラーが表示していない場合、速度を上げるためにコードでできることはありますか? 時間プロファイラー、設定、およびそれらの結果について、より一般的に質問していると思います。すべての遅延が下位レベルのコードまたはシステム フレームワークに起因する場合、それについて何かできることはありますか?

4

3 に答える 3

3

右側の設定パネルでチェックボックスが有効になってHide System Librariesいるため、定義していないメソッドへの呼び出しが非表示になります。たとえば、imageNamed:このチェックボックスを選択して一連の呼び出しを行った場合、システムがこれらの画像を解凍してロードするのにかかる時間は表示されません。

したがって、技術的にはすべての「ラグ」/遅さはシステムフレームワークにありますが、それらの使用方法を変更することは自分で制御できます。また、システム フレームワークのどの操作が時間的に最もコストがかかるかを監視することもできます。

このボックスのチェックを外すことが解決策です:

このボックスのチェックを外します

于 2013-02-18T16:23:00.607 に答える
2

imageNamed:画像をキャッシュします。imageWithContentsOfFile:キャッシュを回避するために使用します。
読み込みが高速化されることを願っています。

于 2013-02-05T17:41:05.770 に答える
1

それらをバックグラウンド/別のスレッドにロードしていますか?そうでない場合は、問題を解決してキューにロードしてください。したがって、画像が読み込まれたら、それを使用するオブジェクトに通知し、画像オブジェクトを渡します。

イメージをロードし、割り当てられたデリゲートに通知する単純な NSOperation を作成します。ロードするイメージごとにこのクラスのオブジェクトを作成して NSOperationQueue に追加し、NSOperationQueue の最大同時操作数を 1 に設定します。

于 2013-02-18T06:33:10.727 に答える