Я работаю над приложением, где есть представление коллекции, а ячейки представления коллекции могут содержать видео. Сейчас я показываю видео с помощью AVPlayer
и AVPlayerLayer
. К сожалению, производительность прокрутки ужасная. Кажется, что AVPlayer
, AVPlayerItem
и AVPlayerLayer
выполняют большую часть своей работы над основным потоком. Они постоянно вынимают блокировки, ждут семафоров и т.д., Которые блокируют основную нить и вызывают сильные капли кадров.
Есть ли способ сказать AVPlayer
прекратить делать так много вещей в основном потоке? До сих пор ничто из того, что я пробовал, не решило проблему.
Я также попытался создать простой видеоплеер, используя AVSampleBufferDisplayLayer
. Используя это, я могу убедиться, что все происходит с основного потока, и я могу достичь ~ 60 кадров в секунду при прокрутке и воспроизведении видео. К сожалению, этот метод намного ниже, и он не обеспечивает такие функции, как воспроизведение звука и очистка времени из коробки. Есть ли способ получить аналогичную производительность с помощью AVPlayer
? Я бы предпочел использовать это.
Edit:
Посмотрев на это больше, не получается добиться хорошей прокрутки при использовании AVPlayer
. Создание AVPlayer
и связывание с экземпляром AVPlayerItem
запускает кучу работы, которая батутно по основному потоку, где он затем ждет семафоров и пытается получить кучу блокировок. Количество времени, которое это останавливает основной поток, увеличивается довольно резко по мере увеличения количества видеороликов в прокрутке.
AVPlayer
dealloc также кажется огромной проблемой. Dealloc'ing AVPlayer
также пытается синхронизировать кучу вещей. Опять же, это становится очень плохо, поскольку вы создаете больше игроков.
Это довольно удручающе, и он делает AVPlayer
почти непригодным для того, что я пытаюсь сделать. Блокировка основной нити, подобной этой, является такой любительской штукой, что трудно поверить, что инженеры Apple допустили такую ошибку. В любом случае, надеюсь, они могут исправить это в ближайшее время.