我正在开发Android设备的应用程序,并发现特别是三星Galaxy S4,当应用程序/网页使用画布时性能极差。 奇怪的是,情况并非如此。
我测试了2个示例应用。
http://ie.microsoft.com/testdrive/Performance/FishIETank/Default.html
和
http://ie.microsoft.com/testdrive/Graphics/TouchEffects/Default.html
第一个工作正常,并且优于我的诺基亚(这是双核)并且是预期的。但是,另一个演示几乎完全没有响应,帧速率接近1,所有其他设备都可以正常运行。
由于第一个应用程序运行良好而另一个应用程序运行良好,因此它提出了问题,为什么? 第一个没有事件监听器,而另一个没有事件监听器。可以触摸移动而不是画布...或者是使用一些画布特征的演示,而另一个不是,因此性能很差。
我已经阅读了很多关于这个问题的主题,似乎没有人回答。大多数都是几个月......所以我认为生病是一个新话题。
有没有办法解决三星S4上的画布问题...以及可能运行4.2.x的其他Android设备。 如果这里的任何StackOverflow用户都有S4,你可以测试这两个演示并确认我的观察结果吗?
答案 0 :(得分:4)
我强烈怀疑这不是特定于Canvas的问题,而是requestAnimationFrame
问题。第一个动画不会尝试使用requestAnimationFrame
,而第二个动画会在line 206
上的this file中使用。{/ p>
固件上的Android浏览器< = 4.2 不支持 requestAnimationFrame
,而是使用setTimeout
,以Hz为单位划分一秒指定的帧速率,执行渲染正常事件循环。
setTimeout
不会在请求的毫秒时间内执行,但会在指定的时间将事件排入循环中。如果事件循环被页面上的其他javascript挂起,或者单核设备决定其他更重要的东西,则运行时非常容易在没有requestAnimationFrame
API的情况下取消优先级排序,使用setTimeout
排队的回调将会断断续续。 More on setTimeout
resolution and timing
不幸的是,如果你(1)采用这种基于Canvas的方法,并且(2)在不支持requestAnimationFrame
的平台上,你将受到事件队列的支配。 Here is the reference table适用于哪些浏览器支持该功能。
干杯!