【问题标题】:Creating and destroying AVFoundation classes on background queues?在后台队列上创建和销毁 AVFoundation 类?
【发布时间】:2013-08-23 01:08:16
【问题描述】:

我试图消除在主线程上分配 AVPlayer、AVPlayerItem 和 AVURLAsset 时发生的一些主线程性能问题。有没有人有将这些对象的分配/释放移动到后台线程的经验?同样,AVPlayer 的 currentItem 是否可以设置在后台队列中?

【问题讨论】:

    标签: ios multithreading avfoundation avplayer


    【解决方案1】:

    以下肯定会影响滚动性能

    • 创建 AVPlayer,10 fps drop
    • 将播放器添加到 AVPlayerLayer,15 fps 下降
    • 开始播放,15/25 fps 下降
    • 暂停播放,15 fps 下降
    • 释放 AVPlayer,20+ fps 丢弃

    我尝试从后台线程分配 AVPlayer,但是,AVFoundation 将切换回主线程并从主线程执行分配/初始化。与播放/暂停相同。

    我在后台线程上解除分配 AVPlayer/AVPlayerItem 取得了一些成功。基本上,您需要从后台线程中清除对 AVPlayer 的最后引用。

    【讨论】:

      【解决方案2】:

      一般来说,如果类文档中没有记录它是线程安全的,则不应跨多个线程使用该类的对象。

      更重要的是,虽然在主线程上做更少的事情有好处,但分配AVPlayerAVPlayerItemAVURLAsset 实际上永远不会成为您需要担心的瓶颈。相反,您应该运行 Instruments 并找到真正的性能问题,然后专注于这些问题。

      【讨论】:

      • 我发现情况并非如此。使用 URL 分配 AVPlayer 项往往会降低滚动性能——即使在后台线程上完成也是如此。究竟为什么会发生这种情况我还不确定。
      • @rob 是正确的。在尝试完成所有这些工作时,您的滚动性能会受到明显影响。 Rob,你有没有在这个问题上取得任何进展?
      • @user3344977 我发现我可以通过将所有可能的东西放在后台线程上来减轻但不能修复滚动性能。 (仅 AVAsset 分配在我的 iPhone 6 上就占用了 30 毫秒。)我还做了一个测试,我使用了一个小于 1k 并加载到设备上的最小视频,这没有任何区别——也就是说,减小视频文件大小和从磁盘加载并没有提高滚动性能。开始电影时似乎不可避免地会锁定主线程约 15 毫秒。我仍然不知道它是什么——时间分析并没有多大帮助。
      • @rob 谢谢。我认为你只能做这么多的优化......最后 AVPlayer 有一些缺陷。看起来像这样实现 60fps 滚动的唯一方法是滚动您自己的播放器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 2012-09-11
      • 2012-11-20
      • 1970-01-01
      • 2016-05-20
      相关资源
      最近更新 更多