2011年5月10日火曜日

FileManager 画面描画が遅い

ファイルのダブルクリックについて調べているうち、/usr/bin以下を表示させると動作がおかしくなることを発見。

このディレクトリには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 件のコメント:

コメントを投稿