2014-06-10 36 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完成处理程序。