2011-10-21 17 views
8

我打開這個matrix multiplication benchmarks和我的瀏覽器(Firefox 7.0.1)凍結,直到基準測試完成(我打開了一箇舊的華碩EeePC 1000H的頁面)。從Web Worker內使用WebGL:有可能嗎?怎麼樣?

我聽說網絡工作者是爲了將處理與顯示網頁分開而發明的。是否有可能利用Web Workers API使WebGL不會停止整個Web瀏覽器?

+0

在其他新聞中,基準是舊的(使用舊版本的各種矩陣庫),錯誤和無效(沒有打擾檢查被調用的函數是否實際上計算相同的東西)。這是一個沒有壞http://stepheneb.github.com/webgl-matrix-benchmarks/matrix_benchmark.html – gman

+1

還沒有。但只要在WebWorker中搜索WebGL,就會發現它已經在使用。 – abergmeier

回答

22

爲了清楚起見:您鏈接的基準根本不使用WebGL。 (我應該知道,我寫了它。)對於那個特定的基準測試,你現在可以在Web Worker中運行它,這將會非常好。 (有趣的事實 - Web Workers在構建基準測試時不支持TypedArrays,並且由於大多數矩陣庫依賴於當時在Worker中運行它是不切實際的,因此已經得到修復。 )

無論如何,要回答您的原始問題:不,WebGL不能在工作人員中運行。對此的核心阻止者是爲了獲得WebGL上下文,您需要在畫布元素上調用getContext。 Web Workers明確禁止DOM訪問(這是一件好事,順便說一句!),因此您永遠無法從工作人員訪問WebGL。

但這並不像您想象的那麼糟糕。首先,考慮到大多數3D渲染實際上是在不同的線程中發生的。具體來說,一大堆線程運行在您的GPU上。瀏覽器中唯一的部分是告訴你的圖形驅動程序「嘿!開始使用這些數據渲染一些三角形!」然後它不繼續等待三角形實際渲染。因此,儘管繪圖命令必須從主進程執行,但它花費在阻塞該進程上的時間通常非常少。

當然,如果你編碼的是實時遊戲,那並不會消耗你一大堆時間。你有動畫,物理,人工智能,碰撞檢測,尋路......有很多非圖形化任務涉及到,如果你讓他們活着吃你的CPU。在某些情況下(動畫),它通常只是矩陣數學的gobs和gobs,就像您鏈接的基準一樣!幸運的是,對於我們來說,這種處理類型可以在Worker中完成,我們需要與主線程進行通信的是呈現場景所需的數據。

是的,這在同步和數據傳輸方面帶來了一些挑戰,但總的來說,當我們嘗試並模擬這500個盒子碰撞時,鎖定瀏覽器將會更好。

+0

哦..因爲這些腳本被稱爲glMatrix和CanvasMatrix,我認爲他們利用WebGL來增加矩陣... –

2

默認情況下,您不能像Toji解釋的那樣在Web Worker中使用WebGL。

你可以看看WebGLWorker這是一個庫,可以讓你在Web Worker中做WebGL的東西,通過透明地將命令代理到主線程。 這是一個不錯的blog post,它解釋了它是如何工作的。

相關問題