直播APP的效能優化-禮物篇

weixin_33936401發表於2016-07-24

介紹

記錄、總結開發遇到一些問題,大家一起交流學習。
這次帶來,對直播APP效能優化的總結,以QA的形式總結。

歡迎關注文集-直播Live

實現方式

1、Q:禮物動畫如何實現?

A:禮物分小禮物動畫和豪華禮物處理;
序列幀+GCD+layer動畫+UIView的Block動畫組合使用;

2、Q:定時器採用CADisplayLink還是NSTimer?

A:都可以。重點在於新增到的mode,個人採用的是新增到NSRunLoopCommonModes的CADisplayLink。

3、Q:CADisplayLink對應的螢幕重新整理和Xcode的FPS是什麼關係?

A:CADisplayLink對應的是螢幕重新整理幀率,一般60FPS;
xcode的FPS是真實顯示的幀率,只要一幀處理的時間超過16ms,顯示幀率就不會為60FPS;

4、Q:小禮物的連擊效果如何實現?

A:邏輯上,禮物連擊可以看成多個桶排成的佇列,禮物贈送者id+禮物型別相同的放在一個桶內。連擊過程中,可以不斷往桶裡放禮物。如果連擊完成,桶裡沒有禮物,開始放下一個桶的禮物。
實現上,給禮物數字放大縮小動畫設定delegate,在stop回撥的時候進行上述的邏輯判斷即可。

5、Q:小禮物的連擊數字是[0-9]的文字圖片組成的,每次顯示都需要拼接圖片,如何優化?

A:用富文字的格式,同時圖片用imageNamed的形式載入;如果記憶體不緊張,可以把富文字根據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:載入圖片iPhone4+iOS7,載入圖片,提示:

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:imageWithContentsOfFile載入的圖片沒有快取,重複使用的時候會載入多次,是否可以用NSMutableArray儲存起來?

A:不行。可以使用NSCache,步驟如下:

1、載入cache中的圖片; 如果有則返回,沒有到步驟2;
2、載入本地的快取檔案,如果有則返回,沒有到步驟3;
3、從網路下載圖片,到步驟4;
4、存入本地的快取檔案,到步驟5;
5、放入cache,返回圖片;

如果不需要網路下載圖片,可以去除3、4步驟,同時可以同步返回;

如果使用array儲存圖片,會一直持有引用;NSCache會在記憶體不足時主動釋放,故而載入的時候需先判斷是否有快取檔案;

4、Q:使用序列幀的時候,需要載入很多次圖片?

A:可以把多張圖片放到一張圖片,載入後通過-CGImageCreateWithImageInRect切割出多張圖片;

記憶體優化

1、Q:直播的時候送出一個豪華禮物,為何記憶體會增加20M?

A:一個豪華禮物佔用的記憶體包括圖片記憶體+Animation(動畫)記憶體;

2、Q:美術給出的資源總共加起來才幾百k的大小,為何載入到記憶體會增加這麼多?

A:先檢視載入方式,+imageNamed:的方式會新增快取,但使用完不釋放;+imageWithContentsOfFile:的方式不會新增快取,重複使用會佔用多次記憶體,但使用完會回收;
其次,通過instruments工具檢視,imageio_png_data佔用記憶體過多;檢視ipa包的圖片資源,發現有三張圖片分別為(3910528 + 1761437 + 9104388),大小佔用450k;簡單計算下,(3910528 + 1761437 + 9104388) * 4 = 25M,確定為三張圖片過大;

3、Q:如何計算出來的圖片大小?

A:圖片的顏色空間為RGBA,那麼載入到記憶體的大小=widthheight4bytes;

效能檢測工具

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.圖片載入可以用imageNamed或者cache實現;
c.儘量避免使用autolayout;
d.控制每幀重新整理數量;
e.刪除過多的歷史訊息;

總結

優化通過壓力測試+instruments工具檢測出瓶頸,同時檢測程式碼邏輯實現。這些QA都是優化過程中的一些問題和解決方案,如果有建議和疑問歡迎交流。

相關文章