【问题标题】:UICollectionView & AVPlayer PerformanceUICollectionView 和 AVPlayer 性能
【发布时间】:2016-05-08 16:31:00
【问题描述】:

我有一个UICollectionView,每个单元格都有一个AVPlayerLayer,它们都在同时播放视频。一次大约可以在屏幕上容纳 9 个单元格,而且非常滞后,因此我需要提高性能以实现平滑滚动的方法。我已经尝试过一些事情:

1) 每个单元格只有一个AVPlayer 实例。它不会被创建,而是在视频 url 更改时调用 player.replaceCurrentItemWithPlayer

2) 因为我使用的是 ReactiveCocoa,所以跳过重复 url 以避免重复播放相同的视频是微不足道的。

我还能做些什么来加快滚动和性能?

【问题讨论】:

  • 请记住,不播放项目的 AVPlayer 不会占用资源,只有在播放之后才会占用资源。要减少资源使用/内存消耗,请将 AVPlayer 的播放器项目设置为 nil。
  • 这是我最新的完美平滑滚动集合视图,带有实时视频预览(一次最多 16 个:youtu.be/7QlaO7WxjGg 它甚至使用封面流自定义布局和“反射”视图完美反映视频预览。源代码在这里:mediafire.com/download/ivecygnlhqxwynr/…

标签: ios swift avplayer avplayerlayer


【解决方案1】:

首先我想说的是,同时看到几个玩家在行动有点疯狂:无论如何渲染都是一项繁重的任务。

据我所知,简单地将视频缩放/重新构图到更小的尺寸并不会减少要渲染的内容:如果您有一张 100x100 的图片要渲染并且您在 10x10 的帧中渲染它,它仍然消耗与原始图片相同的内存量;视频也是如此。因此,请尝试使您的视频资产具有与您将展示它们的帧具有相似的分辨率。

【讨论】:

  • 我知道,但您还有其他可能的解决方案吗?
  • 嗯不是真的。如果在单元格即将出现时滚动变得迟缓,这可能是因为初始化/使用多个 AVPlayer 的繁重性质。这也许是任何时候只能存在一个 MPMoviePlayer 实例的原因之一。
  • 如何做这样的事情:github.com/enormego/ABTableViewCell?我不确定这样的自定义解决方案是否与 iOS 9 相关。
  • 回购没有描述/文档,唯一的链接似乎不起作用....您可能想解释一下该回购试图做什么
  • 这是 Loren Brichter 的快速滚动自定义单元格解决方案。他是制作推文并发明了拉动刷新手势的人。
【解决方案2】:

将每个单元格存储在 NSCache 或 NSMapTable 中,使用 NSIndexPath 作为每个单元格的键;然后,当您需要一个单元格时,直接从缓存或映射表中调用一个单元格。

显然,您必须一次创建所有单元格,但您将获得与在单元格中没有任何内容时相同的滚动性能。

需要示例代码吗?

这是我最新的完美平滑滚动集合视图,带有实时视频预览(一次最多 16 个):

https://youtu.be/7QlaO7WxjGg

它甚至使用封面流自定义布局和完美反映视频预览的“反射”视图。源代码在这里:

http://www.mediafire.com/download/ivecygnlhqxwynr/VideoWallCollectionView.zip

【讨论】:

    【解决方案3】:

    不幸的是,UIKit 在此用例的压力下会遇到瓶颈和丢帧。如果您可以召集重构代码以使用 Facebook 的 AsyncDisplayKit / 那么这将是您最好的选择。

    对于objective-c/this project here是一个很好的参考。 https://github.com/TextureGroup/Texture/tree/master/examples/ASDKTube

    - (ASCellNode *)tableNode:(ASTableNode *)tableNode nodeForRowAtIndexPath:(NSIndexPath *)indexPath
    {
      VideoModel *videoObject = [_videoFeedData objectAtIndex:indexPath.row];
      VideoContentCell *cellNode = [[VideoContentCell alloc] initWithVideoObject:videoObject];
    
      return cellNode;
    }
    

    如果您在 github 中挖掘得足够深,则可以使用 swift 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      相关资源
      最近更新 更多