众所周知,由于安卓对网络流媒体格式的解析支持的不够好,所以当前市面上的在线视频提供商如优酷,乐视,暴风影音等鲜有直接使用安卓的多媒体播放器,他们多是基于开源的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进行性能测试结果如下:
基于ICC对本地库进行重编译,也会使得性能提升。ICC完全兼容GCC,并对Intel ATOM进行了寄存器编译优化,通过ICC编译后的本地代码,***可以有30%的性能提升。
除了以上各种手段以为,Intel还给合作伙伴提供了GPA(Intel Graphics Performance Analyzer) 和Intel Vtune Amplifier 两个工具用于开发过程中的调试。GPA可以实时跟踪应用运行时CPU和GPU的占用率,用于监测应用运行时是否有死锁点。Vtune可以收集应用运行一段时间内的所有操作,跟踪到每一条指令的运行。正是由于有这些丰富的调试手段,我们的合作伙伴才可以在短时间内大幅度提高IA平台上多媒体播放的性能。
引用一位乐视的多媒体工程师的话:“看着自己的多媒体应用在x86平台上可以高效流畅的运行,是一件非常有成就感的事!” 我们也希望越来越多的多媒体应用通过优化以后,可以在x86平台上更高效流畅的运行。(作者:王松月 Intel SSG DRD)