2016-05-08 8 views
1

私はUICollectionViewのセルにそれぞれAVPlayerLayerを持ち、同時にビデオを再生しています。一度に画面に約9個のセルが収まるので、かなり遅いのでスムーズなスクロールを実現するためにパフォーマンスを向上させる方法が必要です。すでに試したことがいくつかあります:UICollectionView&AVPlayerパフォーマンス

1)各セルにはAVPlayerというインスタンスが1つしかありません。作成されず、ビデオURLが変更されたときにplayer.replaceCurrentItemWithPlayerが呼び出されます。

2)ReactiveCocoaを使用しているため、同じビデオを2回再生することを避けるために繰り返しURLをスキップするのは簡単です。

スクロールとパフォーマンスを向上させるために他に何ができますか?

+0

アイテムを再生していないAVPlayerは、後でのみリソースを消費しません。リソースの使用量/メモリ使用量を減らすには、AVPlayerのプレーヤー項目をnilに設定します。 –

+0

リアルタイムのビデオプレビュー(一度に16まで:https://youtu.be/7QlaO7WxjGg)を使った完璧に滑らかなスクロールコレクションビューの最新の反復です。これは、カバーフローのカスタムレイアウトと「反射」ビューを使用していますソースコードはここにあります:http://www.mediafire.com/download/ivecygnlhqxwynr/VideoWallCollectionView.zip –

答えて

2

まずは、いくつかのプレーヤーが同時に行動するのを見るのは少し狂っていると言いたいと思います。とにかくレンダリングするのは大変な作業です。

私が知る限り、ビデオを小さなサイズにスケーリング/再フレームするだけではレンダリングするコンテンツが少なくなりません。レンダリングする100x100のピクチャがあり、それを10x10のフレームでレンダリングすると、元の画像が消費するのと同じ量のメモリを消費します。同じことがビデオになります。したがって、あなたが提示するフレームと同じ解像度を持つビデオアセットを作成してみてください。

+0

私はそれを認識していますが、他の解決策はありますか? – barndog

+0

本当にそうではありません。セルが表示される直前にスクロールが遅くなった場合は、複数のAVPlayersを初期化/使用するという重大な性質のためです。おそらくMPMoviePlayerのインスタンスが1つしか存在できない理由の1つになります。 – Stephenye

+0

このようなことはどうすればよいですか:https://github.com/enormego/ABTableViewCell?そのようなカスタムソリューションがiOS 9と関連しているかどうかはわかりません。 – barndog

2

各セルをNSCacheまたはNSMapTableにNSIndexPathをキーとして格納します。セルが必要なときはいつでも、キャッシュまたはマップテーブルから直接呼び出すことができます。

明らかに、すべてのセルを一度に作成する必要がありますが、セル内で何もしないのと同じスクロールパフォーマンスが得られます。

サンプルコードが必要ですか? 「それも、カバーフローのカスタムレイアウトを使用しています

https://youtu.be/7QlaO7WxjGg

と:ここ

は(一度に16まで)リアルタイムビデオプレビューと完全に滑らかなスクロールコレクションビューの私の最新の繰り返しですビデオのプレビューを完全に反映した「反射」ビューです。ソースコードはここにある:

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

0

残念ながら、UIKitは、ボトルネックをヒットし、このユースケースのために圧力下に置いたときのフレームをドロップします。 FacebookのAsyncDisplayKitを使用するようにリファクタリングコードを募集することができれば、これが最善の策になります。

ここではobjective-c/thisプロジェクトの参考にしています。 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コードがあります。