UICollectionView 和 AVPlayer 性能

UICollectionView & AVPlayer Performance

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

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

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

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

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

据我所知,只是 scaling/re-framing 将视频变小并不会减少渲染的内容:如果您要渲染一张 100x100 的图片,并且在 10x10 的帧中渲染它,它仍然消耗与原始图片消耗的内存量相同的内存;视频也是如此。因此,请尝试使您的视频资产具有与您展示它们的帧相似的分辨率。

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

显然,您必须一次创建所有单元格,但您将获得与完全不创建单元格时相同的滚动性能。

需要示例代码?

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

https://youtu.be/7QlaO7WxjGg

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

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

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

对于objective-c/这个项目这里是一个很好的参考。 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 个代码可用。