如何在x86平臺上優(yōu)化安卓的多媒體類應(yīng)用
眾所周知,由于安卓對網(wǎng)絡(luò)流媒體格式的解析支持的不夠好,所以當(dāng)前市面上的在線視頻提供商如優(yōu)酷,樂視,暴風(fēng)影音等鮮有直接使用安卓的多媒體播放器,他們多是基于開源的FFmpeg加上自己的解碼庫,開發(fā)自己的播放器。這樣做的好處是可以方便的解析M3U8和FLV等流媒體格式,又可以支持RM和RMVB等比較流行的視頻格式,還不用跟著谷歌去不斷的更新安卓多媒體播放器。但是也帶來了一個問題,用自己開發(fā)的多媒體播放器在多數(shù)情況下就只能使用軟件來解碼視頻文件,而無法使用GPU的硬件加速能力,這會帶來過高的CPU占用率,進(jìn)而使得播放視頻時的手機功耗過大,很大的影響了用戶體驗。
這個問題在x86平臺上尤其明顯,由于這些多媒體類應(yīng)用沒有針對x86平臺做過優(yōu)化,所以其本地代碼仍然是基于ARM編譯器編譯的,直接運行在x86平臺上,還要做一次二進(jìn)制轉(zhuǎn)換,這對于軟件解碼造成的過高CPU占用率無異于雪上加霜,會導(dǎo)致更高的CPU占用率和更高的手機功耗。
我們曾經(jīng)直接將樂視和暴風(fēng)影音的安卓客戶端(ARM版本)直接運行在Intel***的CLVT+ 平臺的參考樣機上,效果很差,CPU占用率竟然高達(dá)60%,還有卡頓的現(xiàn)象,但是經(jīng)過Intel Atom平臺SSSE3和Yasm指令集的優(yōu)化,并且用ICC(Intel C/C++ Compiler)工具鏈編譯以后,性能提升非常明顯,CPU占用率竟然下降到13%以下,這已經(jīng)明顯優(yōu)于同級別ARM平臺運行此應(yīng)用時的性能。
以下是對比樂視安卓客戶端的ARM版本和x86優(yōu)化后的版本運行在Intel參考樣機上的CPU占用率對比圖,性能有了4.5倍的提升。

圖一:樂視客戶端優(yōu)化對比
暴風(fēng)影音經(jīng)過Atom 平臺SSSE3和Yasm指令集的優(yōu)化,性能提升更明顯,在K900上測試,優(yōu)化前的ARM版本和優(yōu)化后的x86版本CPU占用率從40%下降到3%,性能有了13倍的提升。

圖二:樂視客戶端優(yōu)化對比
取得這么大的性能提升,連這些ISV都驚嘆不已,究竟是如何做到的呢?
首先,Intel的ATOM平臺支持SSSE3指令集,這些指令集對于優(yōu)化YUV轉(zhuǎn)RGB數(shù)據(jù)***可能有16倍的性能提升,而對于多數(shù)在線視頻提供商使用的FFmpeg開源庫,有大量的YUV轉(zhuǎn)RGB需要處理,因此性能會有提升。
其次FFmpeg項目中有大量基于x86優(yōu)化過的匯編代碼,而這些代碼在基于ARM平臺做交叉編譯時一般會被忽略掉。使用YASM編譯工具可以***限度的復(fù)用這些基于x86優(yōu)化過的匯編代碼,只有話費很少的精力,就可以獲得很高的性能提升。
使用YASM以后,對FFmpeg和X264進(jìn)行性能測試結(jié)果如下:

基于ICC對本地庫進(jìn)行重編譯,也會使得性能提升。ICC完全兼容GCC,并對Intel ATOM進(jìn)行了寄存器編譯優(yōu)化,通過ICC編譯后的本地代碼,***可以有30%的性能提升。
除了以上各種手段以為,Intel還給合作伙伴提供了GPA(Intel Graphics Performance Analyzer) 和Intel Vtune Amplifier 兩個工具用于開發(fā)過程中的調(diào)試。GPA可以實時跟蹤應(yīng)用運行時CPU和GPU的占用率,用于監(jiān)測應(yīng)用運行時是否有死鎖點。Vtune可以收集應(yīng)用運行一段時間內(nèi)的所有操作,跟蹤到每一條指令的運行。正是由于有這些豐富的調(diào)試手段,我們的合作伙伴才可以在短時間內(nèi)大幅度提高IA平臺上多媒體播放的性能。
引用一位樂視的多媒體工程師的話:“看著自己的多媒體應(yīng)用在x86平臺上可以高效流暢的運行,是一件非常有成就感的事!” 我們也希望越來越多的多媒體應(yīng)用通過優(yōu)化以后,可以在x86平臺上更高效流暢的運行。(作者:王松月 Intel SSG DRD)