2013-03-08 38 views
3

我有一個處理某種渲染(webgl)的長時間運行的JavaScript代碼。 這是一種「自適應渲染」,其中我隨着時間的推移越來越精確地計算表面(意味着場景的「分辨率」變得越來越精確)。如何在運行長javascript代碼時處理用戶輸入事件?

只要用戶不按下按鍵或移動鼠標,我就會讓它運行。 正如here所述,我可以使用setTimeout或setInterval,給JavaScript一些時間來處理其他事件。

我測試過的setTimeout和setInterval延誤這一jsFiddle,我觀察到以下結果:

setTimeout delay: 15-20 ms 
setInterval delay: 2-4 ms 

它速度快,但仍然相當困難在我的情況使用。我需要能夠做出反應,完成一些計算並呈現在16毫秒給用戶的印象運行在60 fps

所以這裏的問題(S):

1)有一些其他(更聰明)的方式來檢查是否有要處理一些呼入用戶輸入事件?

2)還有什麼我可以用來做一些「長期運行的代碼可由用戶中斷」? (也許網絡工作者?)

+0

網絡工作者當然可以在這裏幫助你,當然他們只能在更新的瀏覽器上工作... – 2013-03-08 00:52:02

回答

2

你必須把你的代碼分成小塊,並運行每個塊的計時器滴答。在每個計時器滴答聲之間,可以處理用戶事件,並且如果要讓長時間運行的計時器驅動的進程停止執行,可以設置一個標記。

沒有其他方式來處理事件或檢查未決事件。你必須回到主事件循環,這意味着你的JavaScript執行線程需要完成。而且,在返回到事件循環之後,您可以執行更多代碼的唯一方法是響應事件或使用計時器。這只是javascript寫入和構建的方式。

您唯一的選擇是使用網絡工作者,但他們不能觸摸DOM,不能在舊版瀏覽器中工作,並且只能通過消息傳遞與主事件循環進行通信。適合做計算,但不適合做動畫。

+0

我也在考慮這些方面的東西......會用'while(true)'循環來完成檢查每次迭代的當前時間,查看指定的時間量是否已過? – 2013-03-08 00:56:33

+0

@MattB。 - 如果需要,您可以定期檢查長時間運行的代碼停止處理中每隔500毫秒的時間,爲下一次迭代設置一個計時器,然後返回到事件循環。這將有助於控制每段代碼運行的時間長度(不管計算機的速度如何),但顯然必須完成執行以允許處理任何未決事件,然後在計時器上繼續執行。 – jfriend00 2013-03-08 00:59:08

+0

所以,如果我理解正確,我不得不使用setTimeout或setInterval來管理「計時器滴答」?在那種情況下,我能確定事件會被處理嗎? – Sebastien 2013-03-08 02:38:32

相關問題