ライブアプリの性能最適化-プレゼント編
4468 ワード
紹介する
記録、総括開発はいくつかの問題に直面して、みんなは一緒に交流して勉強します.今回は、ライブアプリの性能最適化のまとめを、QA形式でまとめました.
文集-ライブ生放送へようこそ
インプリメンテーションモード
1、Q:プレゼント動画はどうやって実現しますか?
A:プレゼントは小さなプレゼントアニメーションと豪華なプレゼント処理に分けられます.シーケンスフレーム+GCD+layerアニメーション+UIViewのBlockアニメーションを組み合わせて使用します.
2、Q:タイマーはCADisplayLinkかNSTimerか?
A:いいですよ.ポイントは追加されたmodeで、個人的には
NSRunLoopCommonModes
に追加されたCADisplayLinkを採用しています.3、Q:CADisplayLink対応の画面更新とXcodeのFPSとはどんな関係ですか?
A:CADisplayLinkはスクリーンリフレッシュフレームレートに対応し、一般的に60 FPSである.xcodeのFPSは実際に表示されるフレームレートであり、1フレーム処理の時間が16 msを超える限り、表示フレームレートは60 FPSではない.
4、Q:プレゼントの連打効果はどうやって実現しますか?
A:論理的には、贈り物の連撃は複数のバケツが並んでいる列と見なすことができ、贈り物の贈答者id+贈り物のタイプは同じバケツ内に置かれている.連撃の過程で、バケツにプレゼントをどんどん入れることができます.連撃が完了すると、バケツにはプレゼントがなく、バケツのプレゼントを置き始めます.実装では,贈り物の数字を拡大縮小するアニメーションにdelegateを設定し,stopコールバックの際に上記の論理判断を行えばよい.
5、Q:プレゼントの连打数は[0-9]の文字画像で构成されています。表示するたびに画像をつなぎ合わせる必要があります。どうすればいいですか。
A:リッチテキストの形式で、同時に画像はimageNameの形式でロードします.メモリが緊張していない場合は、numに基づいて豊富なテキストをキャッシュし、複数回の接続を避けることができます.
NSMutableAttributedString * mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:sendGiftNumStr];
UIImage *giftNumIcon = [UIImage imageNamed:imageName];
NSTextAttachment *giftXAttachment = [[NSTextAttachment alloc] init];
giftXAttachment.image = giftNumIcon;
NSAttributedString *giftXAttributedString = [NSAttributedString attributedStringWithAttachment:giftXAttachment];
[mutableAttributedString replaceCharactersInRange:NSMakeRange(0, 1) withAttributedString:giftXAttributedString];
画像のロード
1、Q:画像をロードiPhone 4+iOS 7、画像をロード、ヒント:
Could not load the "gift_plane"image referenced from a nib in the bundle with identifier Unable to create unsliced image from csi bitmap data Unsupported pixel format in CSI
A:Images.xcassetsの中のjpg関連の画像をpngに変えます.
The issue is that iOS 7 apps cannot have JPEG images in the CAR file. actool should have copied the JPEG as a loose image into your app's folder. To work around this issue, you should either convert the image to a PNG or include the JPEG as a resource outside of the asset catalog.
2、Q:直接引用方式で導入した画像、pathForResは画像の経路を探しますか?
A:方式1
[UIImage imageNamed:imagePath]
imagePathは画像の相対経路である.方法2:imagePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:imageName];
[UIImage imageWithContentsOfFile:imagePath];
imagePathは画像の相対経路であり、付属しなければならない.pngの接尾辞;
3、Q:i m ageWithContentsOfFileがロードした画像はキャッシュされていません。繰り返し使用すると複数回ロードされますが、NSMutableArrayで保存できますか?
A:だめです.NSCacheを使用できます.手順は次のとおりです.
1、 cache ; , 2;
2、 , , 3;
3、 , 4;
4、 , 5;
5、 cache, ;
ネットワークで画像をダウンロードする必要がなければ、3、4ステップを削除し、同期して戻ることができます.
arrayを使用して画像を格納すると、参照は常に保持されます.NSCacheはメモリ不足時にアクティブに解放されるので、ロード時にキャッシュファイルがあるかどうかを判断する必要があります.
4、Q:シーケンスフレームを使用する場合、何度も画像をロードする必要がありますか?
A:複数の画像を1枚の画像に置くことができ、ロードした後、
-CGImageCreateWithImageInRect
を通じて複数の画像を切断することができる.メモリの最適化
1、Q:生放送で豪華なプレゼントを送ったのに、なぜメモリが20 M増えたの?
A:豪華なプレゼント用メモリには、画像メモリ+Animation(アニメーション)メモリが含まれています.
2、Q:美術が与える資源は全部で数百kの大きさなのに、なぜメモリにロードするとこんなに増えたのですか。
A:まずロード方式を見て、
+imageNamed:
方式でキャッシュが追加されますが、使用が終わっても解放されません.+imageWithContentsOfFile:
方式ではキャッシュは追加されず、繰り返し使用すると複数回のメモリが消費されますが、使用が完了すると回収されます.次にinstrumentsツールで表示し、imageio_png_dataはメモリを消費しすぎます.ipaパッケージの画像リソースを見ると、3枚の画像がそれぞれ(3910528+176437+9104388)、サイズが450 kを占めていることが分かった.簡単な計算では、(3910528+1761437+9104388)*4=25 Mで、3枚の画像が大きすぎると判断された.3、Q:どのように計算した画像の大きさですか。
A:画像の色空間がRGBAであれば、メモリにロードされるサイズ=widthheight 4 bytes;
性能検査ツール
1、Q:instruments録画ボタンunable to find a service to record withを表示する
A:xcodeバージョンでサポートできる最大の携帯電話バージョンをチェックし、問題がなければ携帯電話とxcodeを再起動し、再接続します.
2、Q:instrumentsのAnonymous VM(匿名仮想メモリ)は何ですか?
A:匿名仮想メモリは、システムがプログラムのために予約したもので、すぐに再利用される可能性のある使用可能なメモリの一部です.
3、Q:instruments検査では、プレゼントが頻繁に送られているほか、チャットのUItableViewにも時間がかかることがわかりました。どうやって最適化しますか?
A:cell高さ計算、ピクチャロード、レイアウトlayoutから最適化を開始する.a.cellの高さは変わらず、キャッシュできます.b.画像のロードはimageNameまたはcacheで実現することができる.c.autolayoutの使用をできるだけ避ける.d.フレーム毎のリフレッシュ数を制御する.e.履歴メッセージを削除しすぎた;
まとめ
最適化は圧力テスト+instrumentsツールによってボトルネックを検出し、同時にコード論理実装を検出する.これらのQAはすべて最適化の過程の中のいくつかの問題と解決策で、もし提案と疑問があれば交流を歓迎します.