追剧是许多人每天不可或缺的重要娱乐之一,而视频随选播放平台如何提升更好的观赏体验,也成为各企业持续竞争、提升的关键技术应用类型。最近Amazon发布了网络随选视频播放服务Prime Video应用程序更新,也反映了厂商不断追求技术突破的企图心。在这次的升级作业其中,Prime Video将原本JavaScript的工作负载,部分切换至WebAssembly运行,进而加速图片搭建的性能,举例来说,他们将大部分电视节目的影格搭建时间从28毫秒减少至18毫秒,对于最糟的搭建情况,时间也从40毫秒降至25毫秒。
目前,Prime Video已经在8千多种的设备上提供内容,包括游戏机、电视、机顶盒和USB流媒体电视棒等,Amazon表示,他们在多种类型的设备上提供应用程序,而这些设备每个都需要独立的应用程序版本,这使得他们在更新和性能提升之间,难以做出抉择。因此Amazon开始尝试WebAssembly来解决这个困境,还加入Bytecode Alliance,对WebAssembly社群做出贡献。
Prime Video应用程序分为两部分,一部分是存储在设备上,以C编写的高性能引擎,另一部分则是易于更新的组件,每次在应用程序启动时下载。精简的C层包括:JavaScript VM,以及执行Prime Video应用程序所需要的组件,来处理输出、媒体工作管线、和网络访问等工作。
而下载的部分包括应用程序程序代码,处理场景管理、动画系统、图形渲染、布局和资源管理等低端组件,而过去这些组件皆使用JavaScript。Amazon解释,基于这样的架构可使他们加速新功能和错误修复的脚步,不需经历更新C层缓慢的过程,可以做到每隔数小时就发布一次更新的程度。虽然JavaScript可以频繁更新,但是性能又比C差上许多,因此Amazon时常必须在之中权衡。
后来,Amazon尝试使用WebAssembly,作为解决两难困境的方案。这是因为WebAssembly能够与C或Rust一样,提供强大的语言功能,经编译之后的WebAssembly文件,可以在虚拟机上执行,而虚拟机在程序代码和硬件之间,提供独立于设备的统一接口。经过Amazon数年的实验,他们开始使用Rust撰写并且编译成WebAssembly程序代码,而导入这样的做法后,性能是JavaScript的10倍到25倍。
然而,Amazon又不能完全用Rust重写Prime Video应用程序,并只在WebAssembly VM上执行,因为他们还需要考虑不支持WebAssembly的旧设备和浏览器,因此Amazon最后选择只针对低端系统施作,从JavaScript搬迁至WebAssembly,而这样的形式仍然可以在应用程序上带来性能加速,同时,应用程序团队也不需要在意WebAssembly虚拟机上执行的程序行为。
在新系统中,WebAssembly VM和JavaScript VM能在不同线程上运行,Amazon可以更新用户设备上的内容,加入WebAssembly VM,而该WebAssembly VM能够执行全JavaScript内容,或是同时包含JavaScript、WebAssembly的内容。
当应用程序启动时,程序会检查设备对WebAssembly的支持程度,当设备可以运行WebAssembly,程序会先在设备创建轻量级JavaScript主机节点,该主机节点功能只能向WebAssembly VM发送命令,而WebAssembly主机节点才是真正处理命令的地方。两个虚拟机之间,则会使用消息进行通信,至于WebAssembly组件的工作,是在不中断的情况,尽快更新节点并且推送影格内容到屏幕上。
将部分程序移植到Rust和WebAssembly上,大幅提高应用程序效率之后,也使得影帧数更加稳定,所以,现在的Prime Video能够可靠地实现每秒60影格,除了带来更好的性能,WebAssembly程序节省更多资源——WebAssembly VM所使用的全部内存量,仅有7.5 MB,相较于原本仅依赖JavaScript VM的系统,省下了30 MB,而这样的特色在许多内存资源稀缺的设备上,是一个很大的优点。另外,WebAssembly模块的二进制文件大小,仅有150 KB,Amazon表示,模块体积小,加上虚拟机启动速度快,这代表:即便多加入WebAssembly VM,实际上也不会影响应用程序的启动时间。
借由将Rust编译成WebAssembly程序,也可从Rust的高安全性中获益,因为只要工程师会编写Rust,就能贡献程序代码,并不需要逐行程序代码审查安全性,且对于编译器能够信任之后,开发人员可以把重点摆在功能开发上,而不是处理语言的极端情况。