2014-11-14 21 views
2

所以,我正在使用webgl加載一個3d模型,並且在顯示它之前有一些代碼來執行一些操作。什麼是無阻塞地執行密集javascript的最佳方式?

問題是,這需要幾秒鐘的時間,並完全阻止用戶在此期間做任何事情。這段時間你甚至無法滾動已經夠糟糕了。我聽說在javascript中沒有多線程這樣的東西,但我需要一些不要阻塞主線程的東西。

我甚至嘗試了設置,我的iframe中加載並使用window.postMessage消息事件偵聽器,但似乎幀的域使用了它的JavaScript相同的線程,以及使沒」工作。任何人都有解決方案來處理CPU密集型代碼,以便用戶不會被阻止做任何事情?

+1

WebWorkers ......... – adeneo 2014-11-14 23:03:37

+0

我從來沒有嘗試過,但如何在渲染髮生的窗口下打開彈出窗口。 load事件觸發後,從窗口中抽取DOM節點並將其插入到頁面中?我會發佈一個答案,但我需要先做一些遊戲。 – 2014-11-15 02:50:40

+0

模型的_loading_是您面臨的主要問題 - 而不是回調?如果是這樣,請嘗試'CTMLoader',它可以選擇使用WebWorkers。 http://threejs.org/examples/webgl_loader_ctm.html。 – WestLangley 2014-11-15 03:58:33

回答

1

Web workers API絕對是你所需要的

+0

所以它說網絡工作者不能操縱DOM。他們可以將事件監聽器添加到DOM元素還是不允許? – user1561753 2014-11-14 23:16:09

+0

我對webgl非常不熟悉,但我想你可以直接在worker中處理操作,而使用普通代碼處理頁面。也許這個鏈接會有幫助:http://greenido.wordpress.com/2012/05/20/web-workers-and-big-data-a-real-world-example/ – 2014-11-14 23:23:51

4

真的是沒有一個簡單的答案,至少在目前

  1. WebWorkers

    Web工作在另一個線程中運行JavaScript。不幸的是,他們被允許做的事情非常有限。通常,你所能做的就是來回傳遞消息。 WebWorker無法觸及DOM,它不能執行WebGL或製作Canvas(還)。您目前真正可以做的只是聯網並將字符串和/或鍵入的數組傳入和傳出WebWorker。

    如果您正在做的事情需要大量時間,可以通過JSON字符串和/或類型化數組傳遞迴主線程,這可能適用於您。

  2. 狀態機

    在JavaScript來處理這方面的一個常用方法是使您的裝載機做的事情在幾個國家,這樣就可以調用它像這樣

    function doALittleMoreWork() { 
        ... 
        if (theresStillMoreWorkToDo) { 
        setTimeout(doALittleMoreWork, 16); 
        } 
    } 
    

    或者類似的規定線。 doALittleMoreWork做了一部分工作,然後記得足夠的狀態,所以再次調用時它可以繼續停止。這是怎麼回事O3D loader worked。您可以嘗試使用ES6 generators

    發電機有效地讓你創建一個超級簡單的狀態機。瀏覽器還不支持ES6但也有讓你寫一個簡單的發電機像

    function *foo() { 
        console.log("do first thing"); 
        yield 1; 
        console.log("do 2nd thing"); 
        yield 2; 
        console.log("do 3rd thing"); 
        yield 3; 
        console.log("do 4th thing"); 
        yield 4; 
        console.log("do 5th thing"); 
        yield 5; 
    } 
    

    你現在使用此功能,例如像Google Traceur

    事實上磁帶庫,並且通過traceur you'll see how it turns it into a state machine for you像運行以上#2。

相關問題