追劇是許多人每天不可或缺的重要娛樂之一,而影片隨選播放平臺如何提升更好的觀賞體驗,也成為各業者持續競爭、提升的關鍵技術應用類型。最近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,就能貢獻程式碼,並不需要逐行程式碼審查安全性,且對於編譯器能夠信任之後,開發人員可以把重點擺在功能開發上,而不是處理語言的極端情況。


熱門新聞

Advertisement