2014-06-10 61 views
0

我正在創建一個自定義UI光標。通過每5ms檢查一些輸入值並調整DOM元素的style.top和style.left屬性來確定光標位置。通常這個工作非常順利,但是我發現光標有時會掛起。我不確定是什麼導致了這一點,但它似乎與在WinJS.xhr()調用中緩慢返回的請求有關。WinJS setInterval()掛起

有沒有更好的方法來更新我的遊標UI,以保持它的順利運行?我可以使用另一個線程嗎?

回答

1

請注意,5ms對於屏幕刷新週期而言太快。一個60Hz的屏幕將以16.7ms的間隔刷新,所以沒有理由使用較短的間隔。在這種情況下,您希望使用requestAnimationFrame而不是setInterval,因爲您知道您的UI工作將與屏幕刷新對齊。否則,由於錯位,您肯定會在光標動畫中放下一些幀。

儘管如此,UI線程上的任何阻塞工作都會阻止您的遊標刷新。 WinJS.xhr不一定是這裏的直接罪魁禍首 - 它基本上是XMLHttpRequest的包裝器,它本身是一個異步調用,可用於另一個線程。 但是,處理該請求結果的代碼 - 也就是說,無論您在WinJS.xhr返回的承諾的完成處理程序中有什麼,將在UI線程上運行。所以,如果你在那裏做一堆工作,你可能會阻止幾個刷新週期

不幸的是,JavaScript並沒有給你直接訪問創建單獨的線程。 WinJS。然而,爲此提供了調度機制。檢查出http://msdn.microsoft.com/en-us/library/windows/apps/dn301978.aspxhttp://try.buildwinjs.com/default.aspx#scheduler。我還在Windows開發博客上寫了一篇文章:Managing the JavaScript UI thread with the WinJS Scheduler

這裏要做的是以高優先級運行您的動畫代碼,並以正常或較低優先級運行您的WinJS.xhr完成處理程序。