我正在开发一个应用程序,其中有一个集合视图,并且集合视图的单元格可以包含视频。现在我正在使用 AVPlayer
和 AVPlayerLayer
显示视频。不幸的是,滚动性能非常糟糕。看起来 AVPlayer
、 AVPlayerItem
和 AVPlayerLayer
在主线程上做了很多工作。他们不断取出锁,等待信号量等,这阻塞了主线程,并造成严重的帧下降。
有没有办法告诉 AVPlayer
停止在主线程上做这么多事情?到目前为止,我还没有尝试解决这个问题。
我还尝试用 AVSampleBufferDisplayLayer
构建一个简单的视频播放器。使用它,我可以确保所有的事情都发生在主线程之外,我可以在滚动和播放视频时达到 ~ 60 fps。不幸的是,这种方法的级别要低得多,而且它不提供音频播放和时间擦洗等功能。有没有什么方法可以获得类似的性能与 AVPlayer
?我宁愿用那个。
编辑:
深入研究之后,看起来在使用 AVPlayer
时不可能获得良好的滚动性能。创建一个 AVPlayer
并与一个 AVPlayerItem
实例关联将启动一系列工作,这些工作将蹦床到主线程上,然后在主线程上等待信号量并尝试获取一系列锁。随着 scrollview 中视频数量的增加,主线程停止运行的时间急剧增加。
AVPlayer
交易量似乎也是一个巨大的问题。处理一个 AVPlayer
也试图同步一些东西。同样,当你创造更多的玩家时,情况会变得非常糟糕。
这是相当令人沮丧的,它使 AVPlayer
几乎不可用我正在尝试做的事情。像这样阻止主线是如此业余的事情,所以很难相信苹果的工程师会犯这样的错误。不管怎样,希望他们能尽快解决这个问题。