眾所周知,由于安卓對網絡流媒體格式的解析支持的不夠好,所以當前市面上的在線視頻提供商如優酷,樂視,暴風影音等鮮有直接使用安卓的多媒體播放器,他們多是基于開源的FFmpeg加上自己的解碼庫,開發自己的播放器。這樣做的好處是可以方便的解析M3U8和FLV等流媒體格式,又可以支持RM和RMVB等比較流行的視頻格式,還不用跟著谷歌去不斷的更新安卓多媒體播放器。但是也帶來了一個問題,用自己開發的多媒體播放器在多數情況下就只能使用軟件來解碼視頻文件,而無法使用GPU的硬件加速能力,這會帶來過高的CPU占用率,進而使得播放視頻時的手機功耗過大,很大的影響了用戶體驗。
這個問題在x86平臺上尤其明顯,由于這些多媒體類應用沒有針對x86平臺做過優化,所以其本地代碼仍然是基于ARM編譯器編譯的,直接運行在x86平臺上,還要做一次二進制轉換,這對于軟件解碼造成的過高CPU占用率無異于雪上加霜,會導致更高的CPU占用率和更高的手機功耗。
我們曾經直接將樂視和暴風影音的安卓客戶端(ARM版本)直接運行在Intel最新的CLVT+ 平臺的參考樣機上,效果很差,CPU占用率竟然高達60%,還有卡頓的現象,但是經過Intel Atom平臺SSSE3和Yasm指令集的優化,并且用ICC(Intel C/C++ Compiler)工具鏈編譯以后,性能提升非常明顯,CPU占用率竟然下降到13%以下,這已經明顯優于同級別ARM平臺運行此應用時的性能。
以下是對比樂視安卓客戶端的ARM版本和x86優化后的版本運行在Intel參考樣機上的CPU占用率對比圖,性能有了4.5倍的提升。
圖一:樂視客戶端優化對比
暴風影音經過Atom 平臺SSSE3和Yasm指令集的優化,性能提升更明顯,在K900上測試,優化前的ARM版本和優化后的x86版本CPU占用率從40%下降到3%,性能有了13倍的提升。
圖二:樂視客戶端優化對比
取得這么大的性能提升,連這些ISV都驚嘆不已,究竟是如何做到的呢?
首先,Intel的ATOM平臺支持SSSE3指令集,這些指令集對于優化YUV轉RGB數據最高可能有16倍的性能提升,而對于多數在線視頻提供商使用的FFmpeg開源庫,有大量的YUV轉RGB需要處理,因此性能會有提升。
其次FFmpeg項目中有大量基于x86優化過的匯編代碼,而這些代碼在基于ARM平臺做交叉編譯時一般會被忽略掉。使用YASM編譯工具可以最大限度的復用這些基于x86優化過的匯編代碼,只有話費很少的精力,就可以獲得很高的性能提升。
使用YASM以后,對FFmpeg和X264進行性能測試結果如下:
圖三:YASM對FFmpeg和X264優化性能對比
基于ICC對本地庫進行重編譯,也會使得性能提升。ICC完全兼容GCC,并對Intel ATOM進行了寄存器編譯優化,通過ICC編譯后的本地代碼,最高可以有30%的性能提升。
除了以上各種手段以為,Intel還給合作伙伴提供了GPA(Intel Graphics Performance Analyzer) 和 Intel Vtune Amplifier 兩個工具用于開發過程中的調試。GPA可以實時跟蹤應用運行時CPU和GPU的占用率,用于監測應用運行時是否有死鎖點。Vtune可以收集應用運行一段時間內的所有操作,跟蹤到每一條指令的運行。正是由于有這些豐富的調試手段,我們的合作伙伴才可以在短時間內大幅度提高IA平臺上多媒體播放的性能。
引用一位樂視的多媒體工程師的話:“看著自己的多媒體應用在x86平臺上可以高效流暢的運行,是一件非常有成就感的事!” 我們也希望越來越多的多媒體應用通過優化以后,可以在x86平臺上更高效流暢的運行。
(新聞稿 2013-06-24)