lufy's legend

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 22768|回复: 19

安卓手机可能是要废掉setInterval了

[复制链接]

36

主题

8

好友

9139

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

发表于 2016-10-20 08:58:52 |显示全部楼层
因为最近没太研究H5方面,这个问题也不知道什么时候开始有的,
咱们都知道游戏循环一般都是setTimeout,setInterval和requestAnimationFrame
虽然requestAnimationFrame比前两个要平滑一些,但是前两个更自由一些,所以我一直喜欢用前两个,但是最近发现个问题,可能在做游戏的时候前两个不能再用了
这个问题就是touch事件会让setInterval卡顿一下
我这里有两个demo,这两个demo都非常简单,所以不用考虑效率问题

下面这个demo是我注册了一个空的touch事件,注意是空事件,没有任何逻辑处理,所以不会存在效率问题
http://lufylegend.com/demo/test/143.html

下面这个demo是没有touch事件的
http://lufylegend.com/demo/test/144.html

可以看到,只要注册了touch事件,哪怕是空事件也会导致setInterval卡顿一下
另外,这个不是所有手机,我的一个比较旧的安卓手机却没有这个问题出现,所以我只能猜测是移动最新版chrome的问题,或者是最新版安卓系统的问题,或者是一部分安卓手机的问题,或者是XXX的问题,或者是OOO的问题,反正安卓就是烦...

这让我这个setInterval党情何以堪呢。。。
好了,有了问题就得解决问题,为了查明真相,我又用requestAnimationFrame做了个一样的demo
http://lufylegend.com/demo/test/145.html
嗯..无卡顿现象,所以得出结论touch事件对requestAnimationFrame无影响

所以,大家以后做游戏尽量使用requestAnimationFrame,估计不得不放弃setInterval了


最后说一说在lufylegend.js中如何解决这个问题,因为1.10.1为止,引擎中默认循环一直是setInterval,所以在初始化引擎的时候,需要传入requestAnimationFrame来解决这个问题了,我会在下个版本1.10.2中改一下默认循环的方式
  1. window._requestAF = (function() {
  2.   return window.requestAnimationFrame ||
  3.          window.webkitRequestAnimationFrame ||
  4.          window.mozRequestAnimationFrame ||
  5.          window.oRequestAnimationFrame ||
  6.          window.msRequestAnimationFrame ||
  7.          function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
  8.            window.setTimeout(callback, 1000/60);
  9.          };
  10. })();
  11. LInit(window._requestAF, id, width, height, main);
复制代码
不回答与技术和引擎不相关的问题
回复

使用道具 举报

3

主题

0

好友

179

积分

士兵

Rank: 1

发表于 2016-10-20 09:49:24 |显示全部楼层
反正安卓就是烦
反正安卓就是烦
反正安卓就是烦
回复

使用道具 举报

4

主题

0

好友

100

积分

士兵

Rank: 1

发表于 2016-10-20 09:53:31 |显示全部楼层
反正安卓就是烦  哈哈哈哈
回复

使用道具 举报

46

主题

3

好友

1866

积分

偏将军

Rank: 4

发表于 2016-10-22 20:00:19 |显示全部楼层
说实话,我更倾向于requestAnimationFrame,因为它的确可以使得画面流畅不少呢。
不过我有一个问题,那就是在引擎中,使用requestAnimationFrame后,LGlobal.speed = 1000 / 60,这个值会不会不准确?
回复

使用道具 举报

36

主题

8

好友

9139

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

发表于 2016-10-23 10:28:15 |显示全部楼层
yorhomwang 发表于 2016-10-22 20:00
说实话,我更倾向于requestAnimationFrame,因为它的确可以使得画面流畅不少呢。
不过我有一个问题,那就是 ...

requestAnimationFrame不就是60贞吗,那速度也只能是LGlobal.speed = 1000 / 60了啊
不回答与技术和引擎不相关的问题
回复

使用道具 举报

7

主题

0

好友

129

积分

士兵

Rank: 1

发表于 2016-10-25 10:14:02 |显示全部楼层
requestAnimationFrame很平滑

setinterval有没有touch事件没区别,能看出有卡顿,但是能接受

我的是note5自带的浏览器查看的

回复

使用道具 举报

0

主题

0

好友

4

积分

士兵

Rank: 1

发表于 2016-11-10 14:41:27 |显示全部楼层
requestAnimationFrame当然更好一点,但是浏览器总是不妥协一致
回复

使用道具 举报

24

主题

0

好友

284

积分

帐下督

Rank: 2

发表于 2016-11-12 17:20:58 |显示全部楼层
这个这么用,加下后用不了
http://115.29.161.57/demo2/index.html
回复

使用道具 举报

36

主题

8

好友

9139

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

发表于 2016-11-12 18:30:32 |显示全部楼层
fjmygame 发表于 2016-11-12 17:20
这个这么用,加下后用不了
http://115.29.161.57/demo2/index.html

http://lufylegend.com/demo/test/149.html
你的代码出错,肯定是其他地方代码有问题引起的,请先删除其他代码再测试
不回答与技术和引擎不相关的问题
回复

使用道具 举报

24

主题

0

好友

284

积分

帐下督

Rank: 2

发表于 2016-11-13 15:53:55 |显示全部楼层
lufy 发表于 2016-11-12 18:30
http://lufylegend.com/demo/test/149.html
你的代码出错,肯定是其他地方代码有问题引起的,请先删除其 ...

改了下可以,但是LGlobal.aspectRatio = LANDSCAPE;
这个提示没有作用了 这是bug,还是用错方法了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

防止垃圾广告,请填写任意字符

Archiver|lufy's legend

GMT+8, 2022-5-21 01:02 , Processed in 0.056064 second(s), 31 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部