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 个)的完美平滑滚动集合视图:
它甚至使用封面流自定义布局和 "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 个代码可用。
我有一个 UICollectionView
,每个单元格都有一个 AVPlayerLayer
,同时播放一个视频。屏幕上一次可以容纳大约 9 个单元格,而且它非常滞后,所以我需要提高性能以实现平滑滚动的方法。有一些我已经尝试过的东西:
1) 每个单元格只有一个 AVPlayer
实例。它不会被创建,而是在视频 url 更改时调用 player.replaceCurrentItemWithPlayer
。
2) 因为我使用的是 ReactiveCocoa,跳过重复 urls 以避免播放同一视频两次是微不足道的。
我还能做些什么来加快滚动速度和性能?
首先我想说,同时看到几个玩家在行动有点疯狂:反正渲染是一项繁重的任务。
据我所知,只是 scaling/re-framing 将视频变小并不会减少渲染的内容:如果您要渲染一张 100x100 的图片,并且在 10x10 的帧中渲染它,它仍然消耗与原始图片消耗的内存量相同的内存;视频也是如此。因此,请尝试使您的视频资产具有与您展示它们的帧相似的分辨率。
使用 NSIndexPath 作为每个单元格的键,将每个单元格存储在 NSCache 或 NSMapTable 中;然后,每当你需要一个单元格时,直接从缓存或映射中调用一个单元格 table.
显然,您必须一次创建所有单元格,但您将获得与完全不创建单元格时相同的滚动性能。
需要示例代码?
这是我最新推出的具有实时视频预览(一次最多 16 个)的完美平滑滚动集合视图:
它甚至使用封面流自定义布局和 "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 个代码可用。