2016-12-22 1 views
1

標準のCocoa描画APIを使用してNSViewにグラフを描画しています。下の画像を参照してください。 NSViewには、scrollView内にある複数のグラフがあります。各グラフには約1440データポイントがあり、再描画が行われているためにスクロールしているパフォーマンスの問題が少しあります。円滑なスクロールを実現するためにココアの描画を最適化する方法

画像をスムーズに上下にスクロールできるようにグラフィックを一度しか描画しないようにする方法はありますか?

この同じビューは、PDF出力ファイルを生成するために使用されます。

ビューがサイズ変更されない限り、実際には描画を変更する必要はなく、これは発生しません。スクロール中にビューが再描画されないようにする方法はありません。うまくいけば、ビューが一度それを引き出し、それを記憶に保つための簡単な切り替えがあるのだろうか?

基本コードはNSViewサブクラスのdraw()関数にあります。

override func draw(_ dirtyRect: NSRect) { 

    drawAxis() 

    // Only draw the graph axis during live resize 
    if self.inLiveResize { 
     return 
    } 

    plot1() 
    plot2() 
    plot3() 
    ... 

} 

func plot1(){ 

    for value in plot1Data { 

     path = NSBezierPath() 

     if isFirst { 
      path?.move(to: value) 
     } else { 
      path?.line(to: value) 
     } 
    } 
} 

enter image description here

答えて

3

AppleはそのView Programming Guide: Optimizing View Drawing記事ではかなり総合的なアドバイスを持っています。

あなたがしなければならないものを描くのを避けるために最小限の手順を取っているようには見えません。たとえば、表示されたコードでは、dirtyRectをチェックして、与えられたプロットが完全に外れているかどうかを確認しないため、描画する必要はありません。

しかし、この記事で説明したように、getRectsBeingDrawn(_:count:)および/またはneedsToDraw(_:)メソッドを使用すると、さらによくすることができます。

スクロールビューでは、状況によっては既に描画されているものを保存して、ビューで再描画する必要がないようにすることができます。 release notes for Responsive Scrollingを参照してください。しかし、これの1つの要件は、ビューを不透明にする必要があることです。 trueを返すには、isOpaqueを上書きする必要があります。ただし、クレームだけでは不透明ではありません。 draw()へのすべての呼び出しで汚れた矩形の全体を描画することで、実際にはビューは不透明になります。この要件を満たすために他の描画を行う前に、背景の色で汚れた矩形を塗りつぶすことができます。

クリップビューのcopiesOnScrollプロパティもtrueに設定されていることを確認してください。これはIBで(スクロールビューの属性として表示されていますが)、またはコードで実行できます。これはデフォルトでは真でなければなりません。

応答性スクロールの一部であるオーバードローは、アイドル時間中に徐々に発生することに注意してください。これには、ビューのdraw()メソッドへの繰り返しの呼び出しが含まれます。汚れた矩形と交差するものだけを描画するように最適化していない場合、それらの呼び出しは遅く/高価になります。だから、その最適化を確実にしてください。

+0

良い提案。また、メソッド 'bitmapImageRepForCachingDisplayInRect:'と 'cacheDisplayInRect:toBitmapImageRep:'を調べることもできます。この特定のケースではおそらく不要ですが、誰が知っていますか。 – bhaller

+0

ありがとう、すべての 'NSBezierPaths'を1回だけ作成するのは理にかなっています。つまり、それらを配列に格納し、この配列を繰り返して各パスがダーティ矩形と交差するかどうかをチェックし、 'stroke()'メソッド? –

関連する問題