直播APP的效能優化-禮物篇
介紹
記錄、總結開發遇到一些問題,大家一起交流學習。
這次帶來,對直播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都是優化過程中的一些問題和解決方案,如果有建議和疑問歡迎交流。
相關文章
- 禮物模組是直播類app開發的重點APP
- iOS 直播間送禮物邏輯(禮物連擊)iOS
- 效能優化篇優化
- Android App 效能優化系列結語篇AndroidAPP優化
- IOS效能優化篇iOS優化
- 優化直播app原始碼介面效能,我們可以採取的手段優化APP原始碼
- app 效能優化的那些事APP優化
- Android效能優化篇之計算效能優化Android優化
- iOS 效能篇一一UITableView效能優化iOSUIView優化
- 直播推流端弱網優化策略 | 直播 SDK 效能優化實踐優化
- 前端效能優化JavaScript篇前端優化JavaScript
- Android效能優化(1)—webview優化篇Android優化WebView
- app 效能優化的那些事(二)APP優化
- Android App效能優化技能,看這篇就夠了AndroidAPP優化
- Android效能優化篇之服務優化Android優化
- 效能優化開篇綜述優化
- 效能優化篇 - Performance(工具 & api)優化ORMAPI
- PHP效能優化 -理論篇PHP優化
- UITableView效能優化-中級篇UIView優化
- iOS效能優化 - APP啟動時間優化iOS優化APP
- CSAPP 5 - 優化程式效能APP優化
- App瘦身、效能優化總結APP優化
- Android App效能優化[譯]AndroidAPP優化
- Linux 效能優化之 CPU 篇 ----- 套路篇Linux優化
- 從0開始寫一個直播間的禮物系統
- LiveGiftShow-iOS直播彈幕效果(禮物連擊)iOS
- Linux 效能優化之 IO 篇Linux優化
- Linux 效能優化之 cup 篇Linux優化
- 前端效能優化之路——圖片篇。前端優化
- Spark效能優化指南:高階篇Spark優化
- Spark效能優化指南:基礎篇Spark優化
- jQuery高階技巧——效能優化篇jQuery優化
- Android效能優化之渲染篇Android優化
- iOS效能優化系列篇之“列表流暢度優化”iOS優化
- iOS效能優化系列篇之“優化總體原則”iOS優化
- 直播間禮物機制,已成為直播原始碼開發中佔比最重的功能原始碼
- 詳談[七牛直播雲]效能優化實踐優化
- SQL效能第1篇:關係優化SQL優化