Подтвердить что ты не робот

Производительность прокрутки на основе NSTableview

Я новичок в программировании OS X Cocoa, но решил дать ему новый язык Swift.

У меня есть NSTableView с 1500 строками (будет больше) и 7 столбцами. Существует один столбец флажка, а остальные - текстовые поля, один с форматом даты и один форматирование валюты. Я сначала установил это как основанное на ячейке. Прокрутка была гладкой маслянистой (я даже сделал тест, добавляя 1 миллион строк, все еще гладкий). Это было под мавериками.

Затем я обновился до Yosemite, производительность прокрутки значительно ухудшилась. Включение флажка "Уровень анимации ядра" в представлении таблицы улучшило это, но все еще хуже, чем у mavericks.

Во время моего чтения, пытаясь улучшить производительность прокрутки в Yosemite, я столкнулся с NSTableViews на основе View. Из документации он сказал, что представления таблиц сотовой таблицы обычно не используются и поддерживаются только для устаревших проектов.

Поэтому я преобразовал свою таблицу в представление таблицы на основе View. Пример простой концепции, ничего сложного. Прокрутка производительности абсолютно ужасно. Если вы прокручиваете очень медленно, это достаточно гладко, но как только вы начнете быстрее прокручивать его, как будто он недостаточно буферизирован, он начинает заикаться и дрожать. Кроме того, когда заполняется NSTableView, фокусировка и дефокусировка окна занимает второй или более (я снова попробовал это у mavericks, и этого не было, прокрутка была немного лучше, но все же нигде ближе к сотовой базе).

Являются ли представления на основе NSTableviews всегда плохими для прокрутки производительности? Если да, почему яблоко рекомендует использовать их на основе ячейки NSTableviews.

Также некоторые приложения, такие как сафари и Reeder2, имеют масляную гладкую прокрутку даже в Йосемити. Как они достигают этого?

Я что-то упустил или это производительность OS X, просто попадая в ад с каждой новой вещью? То есть

Маверикs > Йосемити

На основе ячеек > View-Based

Старый > Новый

Любая помощь очень ценится. Спасибо!

4b9b3361

Ответ 1

Согласно Apple, OSX никогда не включает QuartzCore по умолчанию (как IOS, а не делать). Итак, вам нужно:

  • ссылка на QuartzCore.framework вашего проекта в панели "Настройки сборки".
  • включить CoreAnimation Layer (в окне View Effects Inspector on IB) для вашего главного окна (если это возможно, в противном случае обязательно включите его в представлении контейнера, что даст вам плохую производительность).

Указание документов Apple:

В приложениях iOS Core Animation всегда включена и поддерживается каждый вид слоем. В OS X приложения должны явно включить Core Animation выполните следующие действия:

Ссылка на структуру QuartzCore. (приложения iOS должны ссылаться на эту структуру, только если они явно используют интерфейсы Core Animation.) Включите поддержку слоя для одного или нескольких объектов NSView, выполнив одно из следующего:

В ваших файлах nib используйте инспектор View Effects для включения слоя поддержка ваших взглядов. Инспектор отображает флажки для выбранный вид и его подпункты. Рекомендуется включить поддержка слоев в представлении содержимого вашего окна, когда это возможно. Для представлений, которые вы создаете программно, вызывайте представления setWantsLayer: метод и передать значение YES, чтобы указать, что представление должно использовать слои. Включение поддержки слоев одним из предыдущих способов создает с поддержкой слоя. С видом с поддержкой слоя, система берет ответственность за создание объекта нижнего слоя и для чтобы этот слой обновлялся. В OS X также возможно создать что ваш приложение на самом деле создает и управляет объект нижнего слоя. (Вы не можете создавать представления на уровне слоев в iOS.) Для получения дополнительной информации о том, как создать представление на уровне слоев, см. "Layer Hosting позволяет вам изменить объект слоя в OS X".

Подробнее: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/SettingUpLayerObjects/SettingUpLayerObjects.html

Ответ 2

Недавно я оказался в очень похожей ситуации, имея ячейку, основанную на NSOutlineView, которая быстро пылала до-Йосемити и почти ползла к остановке после перехода на Йосемити.

По моему опыту, включение поддержки слоев на самом представлении таблицы недостаточно, вам также нужно включить его для NSScrollView, который содержит ваше представление таблицы, и NSClipView.

После внесения этих изменений мой настольный вид снова увеличился, но он испытывает некоторые странные визуальные артефакты. Это может быть или не быть релевантным в вашей ситуации, так как вы не используете исходный список NSOutlineView, который использует новый материал для виртуализации/прозрачности в Yosemite.

В любом случае эти "эффекты" ушли, как только я перешел в таблицу, основанную на представлении.

Ответ 3

Недавно они внедрили концепцию под названием "Повторное использование очередей", где в таблице присутствуют только строки, которые в настоящее время видны. Строки, выходящие из клипа, при прокрутке заменяются вновь введенными строками. Это было введено для повышения производительности. Но, учитывая миллион x 7 просмотров, я полагаю, что в очереди повторного использования может быть много циклов процессора.
Кроме того, клетки имеют небольшой вес по сравнению с видами.


Если возможно, вы можете рассмотреть возможность реструктуризации единого представления таблицы для нескольких табличных представлений. Практически человек нуждается в просмотре данных, по крайней мере, в своем уме. Например, в организации, которую вы можете просмотреть

  • Все сведения о менеджере
  • Все сотрудники, имеющие зарплату больше, чем x
  • Все работники женского пола

вместо просмотра всех данных о сотрудниках одновременно.
Таким образом, инициализация представления таблицы, только с необходимой информацией повысит как производительность, так и UX.

Ответ 4

У меня такая же проблема. Я также новичок в разработке Swift и Apple в целом. Мой проект работал хорошо, пока я не начал добавлять 1000 или более строк.

После некоторых игр я сузил проблему до того, как к ней подключается мой источник данных на основе словаря. Это может указывать на правильное направление.

 func tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? {...

 return myDictionary.values.array[row] //-- this makes access very slow, jerky with pauses

return myDictionary[someKey] //-- this makes access a lot faster, smooth and slick

Похоже, мой источник данных нуждается в некоторой переработке. Он по-прежнему не тестировался с большими объемами данных, но с самого начала, похоже, имеет существенное значение.

Ответ 5

Вам нужно просто отключить "Draws Background" в текстовой ячейке (или ячейке группы)

enter image description here