Hy,我正在開發一個webgl應用程序,它需要生成大量的2d幾何,例如折線,複雜的多邊形。目前使用的頂點/顏色/索引/ texcoords被預先分配,然後根據主更新循環內的用戶輸入進行計算。WebGL,優化web工作幾何計算
我嘗試儘可能地回收,例如。當繪製150000個圓時,我會嘗試確保幾何體/顏色/ texcoords /指標僅計算一次,除非基本參數(圓形細節,...)不更改,然後平移,縮放(x & y),旋轉此「圓形藍圖」的頂點(將指數&設置頂點顏色),乘以用戶指定的量。
之後數據通過一個drawArrays/drawElements調用發送。繪製多段線和其他基元的處理過程與此類似。雖然這已經非常快,但顯然花了很多時間將原始頂點轉換爲新的位置和維度,有時候只留下少量的用戶可以用來實際構建的東西顯示的資源。
所以我問自己,我怎麼可以外包這些簡單的計算。在考慮採用gpgpu的方式之前,我曾考慮將這些計算轉移給網絡工作者。
所以這是我腦子裏想的:
- 主線:用戶發送請求,繪製150000圈,提供的尺寸,轉換和顏色
- 主線程:請求推到了一個平局請求隊列
- 主線程:請求數據發送給Web工作人員(如果工作人員未啓動或已完成上一個隊列項目)
- Web工作人員:正在使用足夠大的預分配的一組數據truct幾何形狀和改造它
- 網絡工作者:傳遞變換Float32Array頂點,通過 轉讓對象的顏色數據和Uint16Array索引數據的主線程
- 主線:onWorkeRequestProcessed:獲得的數據由工人發送,發送到調用glDrawArrays/glDrawElements呼叫, 將數據發送回給工人
- 網絡工作者:接收回數據,發送「OK,寄託都放回原處,我已經準備好爲另一請求」 MSG到主線程
- 主線程:移隊列,從前面發送下一個請求
... 最後,希望有更多的資源可用於主線程來執行一些用戶啓動的計算。
這樣做意味着主循環必須等待,直到工人完全處理隊列,才能以正確的順序繪製所有內容,最終可能會導致使用過時工人的優勢。
這是我到目前爲止有:https://gist.github.com/automat/8566773(不WebGL的一部分,只是在消息隊列中,沒有主循環,因爲同步圖像framestep和等待工作是一個問題,也是)
順便說一下:通過紋理四邊形虛擬實例化幾何實體不是一種選擇。
你可以看看這裏的項目:https://github.com/automat/canvasGL.js(SRC/GL/cglContext.js應該是特別有趣)
這是什麼好?任何提示讚賞...
這並不完全正確。將工作推送給工作人員可以保持主頁的響應。如果計算一些幾何圖形需要500到10000毫秒,如果您在主頁上執行此操作,除非您編寫一些漸進式事件驅動的生成器,則網頁會凍結500到10000毫秒。用戶無法做任何事情。另一方面,如果您將該工作推送給工作人員,該頁面可以繼續響應用戶輸入。它甚至不管是否有2個CPU,因爲工作人員是線程,這仍然意味着您的主頁面將有機會響應用戶輸入。 – gman
@gman ???用戶界面與這一切有什麼關係?顯然,CPU密集型工作將在其他線程中完成,無論如何。用戶界面線程唯一需要做的就是控制整個計算鏈:啓動/停止並傳遞用戶輸入(攝像機移動,播放器位移等)。 –
我們在說WebGL,所以我們在瀏覽器中。讓我們呆在那裏是半徑的屏幕上的滑塊。如果需要10000毫秒(10秒)來產生一個球體,那麼在整個10秒內滑塊變得無響應。另一方面,如果在工作人員上計算球體,則滑塊保持響應。它可能是10秒,直到一個球體出現正確的大小,至少該滑塊沒有被卡住10秒。用戶還可以更新其他內容,文本字段,其他滑塊等。但是,只有在幾何體是在工作人員中計算或分解爲小事件的情況下才可以。 – gman