2

アプリのスクロールのパフォーマンスを改善しようとしています。私は一般的に受け入れられているすべてのアドバイス(CGで自分で描く、セルが不透明、サブビューがないなど)に従いましたが、バックグラウンドのCPUとネットワークアクティビティがあると、まだ途切れることがあります。

ここに述べられている1つの解決策:

http://www.fieryrobot.com/blog/2008/10/08/more-glassy-scrolling-with-uitableview/

試したセルのビットマップスナップショットをキャッシュすることです。しかし、ビットマップはあいまいで、大量のメモリを消費していました(それぞれ数百kb)。

そのリンクのコメントの1つの提案は、セルがグラフィックカードのメモリに移動するため、CGLayerまたはCALayer(?)を使用してセルをキャッシュすることです。それで、いくつかの質問、

1)これを試したことはありますか?サンプルコード?

2)iphone / ipod touchグラフィックカードにはどのくらいのメモリがありますか?これは意味がありますか?

3)物事をスピードアップするための他の提案はありますか?


詳しくは

私は(電話で)CPUサンプラーを使用し、問題を解明するためにセルから物事を体系的に排除しました。いくつかのこと:

1)セルの設定ではありません。描画呼び出し(drawinrectなど)だけを削除し、セットアップをそのままにしておくと、ガラスのようになります。

2)最小の画像(25x25 png)の描画ではありませんが、それを入れても問題ありません。

3)2番目または3番目の画像(最初は大きな背景320x1004kB、もう1つはボタン画像61x35 4kB)を追加すると、途切れます。クラスメソッドで両方のUIImageを取得しているので、キャッシュされます。

4)テキストも問題です。drawRectは、その時間の75%を私が使用している3つのNSStringdrawInRectメソッドに費やしているようです。好き:

[mytext drawInRect:drawrect withFont:myFont lineBreakMode:UILineBreakModeTailTruncation];

それらの呼び出しはWebコアを経由しているようですが、おそらくそれがいくつかのスタッターを引き起こしますか?2行のテキストと1つの小さな段落のテキストをフォーマットできる必要があります。テキストを省略記号で切り捨てる機能が必要です。これらをクリティカルパスから実行してキャッシュできますか?その部分をレイヤーでできますか?

4

2 に答える 2

4

CGLayer は GPU にキャッシュされず、Core Graphics 要素をコンテキストに描画するプロセス中に使用されます。CALayer のビジュアル コンテンツは GPU にキャッシュされています。これにより、メモリ使用量の一部を「隠す」ことができますが、多くの CALayer を保持している場合、メモリの問題が発生する可能性があります。

正直なところ、Loren Brichter などによって説明されているように、コア グラフィックスを介してすべてのコンテンツを 1 つのレイヤーに描画し、セルを不透明にし、テーブル ビューのセル再利用メカニズムに従うテーブル ビューのベスト プラクティスに従っている場合は、あなたができることはこれ以上ありません。iPhone の CPU に過負荷がかかると、スクロールをどれだけ最適化しても、スクロールがカクカクします。慣性スクロール アニメーションを実行するには、ある程度の CPU パワーが必要です。

最後に確認すべきことは、参照するバックグラウンド CPU およびネットワーク プロセスが実際にバックグラウンド スレッドで実行されていることです。メイン スレッドで実行されているものはすべて、そのタスクの処理中にインタラクション メソッドを一時停止させ、スクロールの不安定さを増す可能性があります。

于 2010-01-10T16:13:02.237 に答える
0

最適化に深く入り込む前に、デリゲートの で[tableView dequeueReusableCellWithIdentifier:]を作成するためにセル再利用メカニズム ( ) を使用していますか?UITableViewCelltableView:cellForRowAtIndexPath:

また、Instruments のアクティビティ モニターを使用して、シミュレーターでコードを実行しましたか? 間隔を 1 ミリ秒に設定し (デフォルトの 10 ミリ秒は大きすぎることがわかりました)、スクロールを行うときにほとんどの時間が費やされている場所を確認します。

于 2010-01-10T13:08:44.433 に答える