Я использую NSCollectionView
, который показывает изображения, которые мне нужно визуализировать в фоновом режиме. Этот рендеринг занимает значительное время (например, от 100 мс до более секунды).
Я использую обычную схему потока (NSCollectionViewFlowLayout
) с плитками одинакового размера NSCollectionViewItem
.
Как только collectionView запускается, он создает гораздо больше экземпляров элементов (плиток), чем фактически вписывается в текущий вид. Например, если в поле зрения помещается 6 плиток, запрашивается около 20 плиток. Я начинаю процесс рендеринга для каждой созданной плитки. Как только изображение было визуализировано, плитка получает уведомление, что, в свою очередь, приводит к обновлению ее вида.
Теперь, когда происходит рендеринг, пользователь может прокрутить вниз, например, до последних 6 плиток. Это создает проблему производительности:
В очереди все еще много визуализаций для плиток, которые еще не были видны и не будут видны в ближайшее время (они были пропущены пользователем, когда он прокрутил их непосредственно до конца). CollectionView, теперь запрашивающий представления для теперь видимых последних 6 плиток, отбросит 6 из своих ранее выделенных, 4 из которых, возможно, уже были визуализированы и помечены как отбрасываемые в любом случае, поэтому только 2 из оставшихся 16 плиток в очереди рендеринга будут уведомили, что они не понадобятся и будут удалены из очереди. И вновь видимые 6 плиток с конца будут добавлены в очередь рендеринга.
Это означает, что до того, как пользователь начнет видеть какие-либо изображения, с которых он был прокручен, необходимо будет отрендерить еще 14 изображений, даже если они не отображаются в области содержимого текущего представления коллекции.
Как я могу оптимизировать это, чтобы, когда пользователь прокручивал, я немедленно начинал рендерить самые новые видимые NSCollectionViewItem
с? Кажется, что ни одна из функций делегата не помогает с этим. Даже такие функции, как visibleItems
, возвращают не только видимые, но и все функции, выделенные collectionView, включая 14 невидимых.
Я мог бы при добавлении элементов в очередь всегда вставлять их в начало, а не добавлять их в конец очереди. Это также не помогло бы, потому что тогда, когда первоначально collectionView запрашивает 20 плиток, я в конечном итоге должен был сначала рендерить 20-ю плитку, и, таким образом, в итоге не отображал никаких визуализаций до тех пор, пока не было визуализировано 14 невидимых.