私のデータ視覚化アプリでは、再描画中に大きなメモリ消費スパイクが発生します (drawRect をトリガーする setNeedsDisplay)。現在、データ プロットを格納するビュー全体を再描画しています。このビューは、デバイスのディスプレイよりもはるかに大きくなっています。
現在の素朴なアプローチではなく、CoreGraphics に各要素を描画するのに十分なメモリを割り当て (各要素はデバイスの表示よりもはるかに小さい小さな長方形のブロックです)、完了したらメモリを解放するように指示する方法はありますか?
前もって感謝します。
-ダグ
更新 12 月 8 日午前 8 時 28 分 EST
関連するコードと説明文を次に示します。ObjectAlloc、Memory Monitor、および Leaks インストゥルメントを実行しているインストゥルメントを実行しています。私が持っている唯一のメモリリークは、NSOperationQueueがメモリを解放していないことに関係しています。これはマイナーであり、関連性はありません。
アーキテクチャ的には、このアプリは、検査するヒトゲノムに沿った興味深い場所のリストを含む tableView で構成されています。テーブルの行が選択されたら、alignmentData というデータを返すデータ収集操作をキューに入れます。このデータは、水平の長方形のスラブとしてプロットされます。
最初に、tableView を起動したときのメモリ フットプリントは 5 MB です。
- (void)viewWillAppear:(BOOL)animated {
// Initial dimensions for the alignment view are set here. These
// dimensions were roughed out in IB.
frame = self.alignmentView.frame;
frame.origin.x = 0.0;
frame.origin.y = 0.0;
frame.size.width = self.scrollView.contentSize.width;
frame.size.height = 2.0 * (self.containerView.frame.size.height);
}
注: viewWillAppear: が呼び出された後、メモリ フットプリントは変化していません。にもかかわらず、alignmentView のサイズはディスプレイのサイズをはるかに超えています。
これは、データ収集操作から呼び出されるメソッドです。
- (void)didFinishRetrievingAlignmentData:(NSDictionary *)results {
// Data retrieved from the data server via the data gathering operation
NSMutableData *alignmentData = [[results objectForKey:@"alignmentData"] retain];
NSMutableArray *alignments = [[NSMutableArray alloc] init];
while (offset < [alignmentData length]) {
// ...
// Ingest alignmentData in alignments array
// ...
} // while (offset < [alignmentData length])
[alignmentData release];
// Take the array of alignment objects and position them in screen space
// so that they pack densely creating horizontal rows of alignment objects
// in the process.
self.alignmentView.packedAlignmentRows =
[Alignment packAlignments:alignments basepairStart:self.startBasepairValue basepairEnd:self.endBasepairValue];
[alignments release];
[self.alignmentView setNeedsDisplay];
}
このコード行の後:
self.alignmentView.packedAlignmentRows = ...
メモリ使用量は 13.8 MB
このコード行の後:
[self.alignmentView setNeedsDisplay];
メモリ フットプリントが 21.5 MB に急増し、そこに数秒間留まり、その後、既存の 13.8 MB のレベルに戻ります。
私が探しているソリューションでは、基本的に、整列オブジェクトの 1 行の高さである水平レンダー バッファー ウィンドウを作成できます。そのメモリ レンダーを割り当ててから破棄します。アライメント データの行ごとに、これを何度も繰り返します。
理論的には、このアプローチを使用して無限の量のデータをレンダリングできますが、これはもちろん最も優れた方法です ;-)。
-ダグ