このディレクトリには1000くらいのファイルが置かれているせいらしい。1000くらいのオーダーでだめになるなら、とてもファイルマネージャとは呼べない。
現在のFileCellのdrawRectはこうなっている。(恥を忍んで公開、ということで)
NSRect rect=[self bounds]; NSPoint point; point=NSMakePoint(CONTENT_CELL_LEFT_MARGINE, rect.size.height-CONTENT_CELL_HEIGHT); for (NSInteger i=0; i<[contentFileArray count]; i++) { FileCell* cell=[contentFileArray objectAtIndex:i]; NSRect cellFrameRect=NSMakeRect(point.x, point.y,maxCellSize.width,maxCellSize.height); [cell drawWithFrame:cellFrameRect inView:self]; point.y-=maxCellSize.height; if (point.y<0) { point.y=rect.size.height-maxCellSize.height; point.x+=maxCellSize.width+CONTENT_CELL_CENTER_MARGINE+CONTENT_CELL_LEFT_MARGINE; } }非常にシンプルというか簡単すぎるというか。ファイル(を収めたCell)がいくらあっても、単純に「縦に最大行数まで表示したら、あらかじめ設定してあるCellの幅+マージン分、CellのFrameのorigin.xをずらす」とやっているだけ。現在Cellの幅は決め打ちで350ピクセル。
これで1000個のファイルがあると、縦に20行表示できるとしたら横の桁は単純に計算して50桁。Viewのframeは350×50で17500ピクセルの横幅(^^;)。
drawRectが呼ばれるたびにこれだけの大きさのViewを描画していたら、そりゃおそくもなるわな。
- (void)drawRect:(NSRect)dirtyRectのdirtyRectだけを描画するようにするか、clipViewの大きさで表示できるだけのCellを描画するようにするか、表示を「ページ」単位にして(もちろんページの大きさの計算は自分でやらないといけない)してしまうか。
Viewの表示の高速化はGUIプログラミングの肝だから、たくさんのサンプルがあちこちころがっている気もするが・・・。当面、「描画の高速化」を研究することになりそうだ。
NSTableViewを使うことにすればこういう問題からは解放されるんだろうなあ、と耳許で囁く声もきこえるぞ。(^^;)
0 件のコメント:
コメントを投稿