7

私は 5 つの列を持つ NSTableView を持っており、それぞれが nib に在庫の NSTableCellView を含んでいます。(ストック セルには、テキスト ボックスとオプションの画像があります。) データが入力されると、テーブルには約 50 行が表示されます。すべて正常に表示されますが、スクロールのパフォーマンスはかなり悪いです。テーブルがスクロールするたびに、すべてのセルが完全な四角形の drawRect: メッセージを取得するため、これが発生しているように見えます。ただし、 reloadData も reloadDataForRowIndexes:ColumnIndexes: も呼び出されていないため、そうではありません。セルの内容でもありません。すべてのコードをコメントアウトして、各セルのデフォルトのセル画像とテキストをそのままにしてみましたが、パフォーマンスは同じです。スクロール中、どのセルも更新されません。(確認のため、tableView:viewForTableColumn:row: にブレークポイントを設定しました。)

私の実装には、次のデリゲート メソッドがあります。

  • tableView:viewForTableColumn:row: デリゲートで。これにより、makeViewWithIdentifier:owner: を介して新しいセルが作成され、入力されます。
  • numberOfRowsInTableView: データ ソース内。これは定数を返します
  • tableView:sortDescriptorsDidChange: データ ソース内

それでおしまい!それほど複雑ではありませんが、まだです。

完全に明らかな何かが欠けているように感じます。これらの再描画の原因は何ですか?


編集:考えてみると、他のいくつかのアプリケーション (uTorrent、Xcode) は、同じ遅いスクロール動作を示しているようです。スクロールしながらCPU使用率を見れば一目瞭然です。一方、Activity Monitor は非常にスムーズなスクロールで、CPU の使用率をほとんど上げません。アプリでそれを取得するにはどうすればよいですか?


編集2:間違いを見つけたと思います。アップルによると

iOS アプリでは、コア アニメーションは常に有効になっており、すべてのビューはレイヤーによってサポートされています。OS X では、アプリは次の手順を実行して Core Animation サポートを明示的に有効にする必要があります。

  • QuartzCore フレームワークにリンクします。(iOS アプリは、Core Animation インターフェイスを明示的に使用する場合にのみ、このフレームワークにリンクする必要があります。)
  • 次のいずれかを実行して、1 つ以上の NSView オブジェクトのレイヤー サポートを有効にします。

    • nib ファイルで、View Effects インスペクターを使用して、ビューのレイヤー サポートを有効にします。インスペクタには、選択したビューとそのサブビューのチェックボックスが表示されます。可能な限り、ウィンドウのコンテンツ ビューでレイヤー サポートを有効にすることをお勧めします。
    • プログラムで作成するビューの場合、ビューの setWantsLayer: メソッドを呼び出し、値 YES を渡して、ビューがレイヤーを使用する必要があることを示します。

前述のいずれかの方法でレイヤー サポートを有効にすると、レイヤーに基づくビューが作成されます。レイヤーに基づくビューでは、システムは下層のレイヤー オブジェクトを作成し、そのレイヤーを更新し続ける責任を負います。OS X では、レイヤー ホスティング ビューを作成することもできます。これにより、アプリは実際に下層のレイヤー オブジェクトを作成および管理します。(iOS ではレイヤー ホスティング ビューを作成できません。) レイヤー ホスティング ビューの作成方法の詳細については、「OS X でレイヤー ホスティングを使用すると、レイヤー オブジェクトを変更できます。」を参照してください。</p>

パフォーマンスの問題を修正したらすぐに回答を追加します。大まかなパスでは、スクロールはまだでこぼこしていますが、スクロール中の CPU 使用率は 70% から 10% に低下しました。

4

1 に答える 1