轉:http://www.techbrood.com/zh/news/webgl/webgl%E3%80%81asm_js%E5%92%8Cwebassembly%E6%A6%82%E5%BF%B5%E7%AE%80%E4%BB%8B.htmlhtml
iefreer 發表於 2017-02-27 13:00:56html5
隨着HTML技術的發展,網頁要解決的問題已經遠不止是簡單的文本信息,而包括了更多的高性能圖像處理和3D渲染方面。web
這正是要引入WebGL、Asm.js和WebAssembly這些技術的緣由。瀏覽器
WebGL是爲了給Web添加相似桌面(或移動)系統上的OpenGL的特性支持,從而實現強大的3D圖形渲染效果。性能優化
Asm.js是一個JavaScript的一個嚴格的子集,能夠被用來做爲一個底層的、高效的編譯器目標語言。asm.js提供了一個相似於C/C++虛擬機的抽象實現,包括大型二進制堆、整型和浮點運算、高階函數定義、函數指針等語法特性。具體來講,就是經過VM(如Emscripten)把一些本地代碼(如C語言)生成的VM字節碼(bytecode)翻譯成前述嚴格子集的JS代碼得以在Web上運行,並經過瀏覽器的支持,獲得性能優化。函數
c/c++---->Emscripten(VM)---->asm.js(一種js語言)。性能
那麼WebAssembly(簡稱wasm)又是什麼鬼?顧名思義,看起來是在Web中引入的低級語言,其目的和Asm.js相似,也是要支持本地代碼的運行從而得到媲美原生應用的高性能,咱們能夠先觀摩一個使用WebAssembly技術的在線網頁遊戲實例,該遊戲性能可媲美原生應用。那麼既然有了Asm.js,爲何還須要WebAssembly?由於Asm.js只有Mozzila支持,而WebAssembly是Mozzila、Google、Microsoft以及一些其餘組織擬聯手製定的遊戲規則,另外WebAssembly最終將從JS中分離出來,成爲一個相對獨立的編譯器目標語言,這樣能夠沒必要爲了本地代碼的運行,而在JS中引入太多內容,未來Wasm和JS會是分工合做的關係。優化
第一眼看到WebAssembly的時候,咱們或許會天然的想到其對WebGL的影響。由於經過WebAssembly能夠直接把原生代碼(如c/c++語言)應用在瀏覽器中運行,那麼理論上(理想狀況下),咱們能夠在網頁上運行PhotoShop或者魔獸爭霸這樣的大型軟件(只要經過WebAssembly給移植過來)而無需從新編寫JS代碼。但實際上咱們須要釐清這2個概念是兩個層面的東西,WebAssembly是網頁低級語言,WebGL是瀏覽器實現的接口標準,容許客戶端腳本語言(即ECMAScript,JavaScript,Webassembly)使用原生3D圖形庫。WebAssembly對應於彙編語言,而WebGL對應於OpenGL或DirectX。因此WebAssembly依賴於WebGL來實現3D渲染。其影響在於,有了WebAssembly,WebGL在後續標準制定中須要多提供一個低級語言接口,工程師在實現網頁3D應用的時候除了JS以外多了一種選擇(可使用原生語言和wasm)。webgl