Cocoaで非常に大きなスクロールビューを実装する方法
-
06-07-2019 - |
質問
Cocoaで約15000ピクセルの大きさのビューを作成するのは賢明ですか? (もちろん、このビューのごく一部のみが NSScrollView
で一度に表示されます)
Interface Builderのサイズには10000ピクセルの制限があります。これは人為的な制限ですか、またはその背後に正当な理由がありますか?
巨大なビューを作成して、 NSScrollView
/ Quartzで効率的にレンダリングすることを心配する必要がありますか(私のビューは drawRect
で要求された領域内にプログラムで描画されます)メモリ使用量やその他の問題? (たとえば、OS Xはいつでもビデオメモリにビューのビットマップ全体をキャッシュしようとすることができますか?)
解決
ビューには、レイヤーに裏付けされていない限り、バッキングストアがありません。ウィンドウはバッキングストアを持っているため、ビューの表示に使用されるメモリの量はウィンドウのサイズに制限されます。
つまり、答えはイエスです。先に進み、ビューを必要なだけ大きくします。
(もちろん、ビューで行う描画を drawRect:
で渡された矩形に制限するか、不可視の描画に多くの時間を浪費することになります。
他のヒント
まあ、Cocoaがビュー全体をメモリにキャッシュしようとすると、問題になります:
10000 * 10000 = 100,000,000
* 4 = 400,000,000
これは、 one ビューの生のRGBAピクセルで400 MBです。本当に悲観的になりたい場合は、NSViewがそれをダブルバッファリングしていると仮定します。この場合、メモリ使用量は800 MBに倍増します。
最悪の場合、ユーザーは1 GBのRAMを搭載した古いMac miniでアプリを実行していますが、そのうち80%しか使用していません。システムは確実にこの時点の前にページングを開始し、システムを耐え難いほど遅くします。
一方、それは私が考えることができる最も簡単な実装方法なので、試してみて、アクティビティモニターがメモリ使用量について何を言っているのかを確認してください。高すぎる場合は、スクロールビューとクリップビューのさまざまなオプションを変更してみてください。それがうまくいかない場合、私はあなた自身のスクローラーを作り、それを偽造する以外に何も考えられません。