为什么当touchstart事件触发时setTimeout游戏循环会出现延迟
Why is setTimeout game loop experiencing lag when touchstart event fires?
这是我遇到的一个相当具体的问题。这个故障似乎只出现在最新的Android版Chrome中,所以这里是规格:
应用程序版本:Chrome 45.0.2454.84
操作系统:Android 4.4.4;XT1031构建/KXB21.14-L2.4
我用的是Moto G,但运行同一版本Chrome的三星手机也出现了这个问题。无论如何,问题显然是touchstart
事件打断了我的window.setTimeout
游戏循环。下面是代码:
(
function rafTouchGlitch() {
/////////////////
/* FUNCTIONS. */
///////////////
function touchStartWindow(event_) {
event_.preventDefault();
}
///////////////////////
/* OBJECT LITERALS. */
/////////////////////
var engine = {
/* FUNCTIONS. */
start : function(interval_) {
var handle = this;
(function update() {
handle.timeout = window.setTimeout(update, interval_);
/* Draw the background and the red square. */
display.fillStyle = "#303030";
display.fillRect(0, 0, display.canvas.width, display.canvas.height);
display.fillStyle = "#f00000";
display.fillRect(red_square.x, red_square.y, 20, 20);
/* Update the square's position. */
red_square.x++;
if (red_square.x > display.canvas.width) {
red_square.x = -20;
}
})();
},
/* VARIABLES. */
timeout : undefined
};
red_square = {
/* VARIABLES. */
x : 0,
y : 0
};
/////////////////
/* VARIABLES. */
///////////////
var display = document.getElementById("canvas").getContext("2d");
//////////////////
/* INITIALIZE. */
////////////////
window.addEventListener("touchstart", touchStartWindow);
engine.start(1000 / 60);
})();
这段代码在任何其他浏览器中都可以正常工作,甚至在以前版本的Chrome中。它在上一个版本中工作得很好,但由于某种原因,现在有一个问题。我不确定这是否是Chrome端的一个bug,或者如果他们正在做一些新的事情,我是一个没有覆盖我的基础,但事实仍然是,当touchstart
事件发生时,我的游戏循环中有一个明显的滞后。
这里有一个小提琴:https://jsfiddle.net/dhjsqqxn/
点击屏幕,看看红色方块是如何滞后的!这是荒谬的。你可以通过快速点击屏幕来冻结Timeout对象。
如果你用的是安卓手机,我强烈建议你升级Chrome浏览器,并访问链接来了解我的意思。如果这是一个漏洞,那也是一个巨大的漏洞,考虑到setTimeout
的价值和touchstart
在移动设备上的重要性。如果不是bug,我真的很想知道我做错了什么。
谢谢你的时间!
参见https://bugs.chromium.org/p/chromium/issues/detail?id=567800
Android Chrome在touchmove期间不运行预定的(setTimeout/setInterval)回调。
作为一种解决方法,你可以尝试window.requestAnimationFrame()或在touchmove事件中手动运行回调,这将需要保留/检查最后运行时间
在touchstart函数结束时执行"return false;"
为滑动下面的jquery没有jquerymobile..
$("#id").on({'touchstart' : functionforstart, 'touchmove' :onmove, 'touchend' : functionforend});
functionforstart(e){ e.originalEvent.touches[0].pageX usw.. return false;}
function onmove(e){lastMove=e}
function functionforend(){lastMove.originalEvent.touches[0].pageX} usw.. e.prefentDefault(); }
这对我来说很有用。var lastMove必须是全局的,你需要一个touchmove步骤来获得touchend的位置。希望这也是你所需要的。
- setInterval游戏循环的范围问题
- Javascript游戏与循环崩溃浏览器
- 正面或反面游戏javascript do/while循环
- 使用for循环的Fizzbuzz游戏
- Javascript猜号游戏 - 设置计数器和while循环
- 三.js对象启动动画/游戏循环
- 节点.js和画布,游戏循环不同步
- 如何使用 for 循环来检查井字游戏中的获胜者
- JavaScript 游戏循环不起作用
- 检查图像是否在游戏循环之前加载
- 使用 requestAnimationFrame 的 JS 游戏循环 - 对象函数只调用一次
- HTML 5 画布:在游戏中使用绘制图像会使循环非常慢
- 我如何让这个 JavaScript 数字猜谜游戏在没有“while”或“for”循环的情况下工作
- WP 8.1 WinJS-如何停止游戏循环
- Javascript游戏循环-如何知道循环外的函数经过了多少时间
- 在Node.js+websocket服务器上循环浏览游戏对象
- 游戏循环使我的浏览器崩溃
- 如何在javascript中实现准确的跨平台游戏循环
- Javascript游戏:如何;“暂停”;while循环以等待用户输入
- 用于循环游戏骰子的函数