我正在开发一款基于浏览器的haxe游戏。只要我将浏览器选项卡作为我的活动选项卡,一切都按照预期和顺利进行,但只要我切换选项卡(无论我是否使用chrome或firefox)它都会完全停止工作并且不会发送任何选项卡心跳到我的服务器。
我知道,非活动标签的性能会降低,我也知道,不允许非活动标签加载资源。 (我的游戏不这样做。)
我希望我的游戏在处于非活动状态时继续运行,更重要的是,我希望它能够向服务器发送心跳。
有什么办法可以强制执行吗?
我正在使用Kha和Haxe,我尝试了haxe原生调度程序用于心跳和kha调度程序,它们都不起作用。
答案 0 :(得分:2)
您已找到它,但我认为window.Top
应为window.top
。
如果您不使用:Dynamic
,这样的事情就会出错。 Window是一个类型化的对象,你会得到很好的错误,这是一种严格类型语言的好东西之一。 requestAnimationFrame
是窗口上的全局函数,因此此代码段无需动态注释即可运行。
var window = Browser.window;
if (window.requestAnimationFrame == null || window.top != window.self) window.setTimeout(animate, 1000.0 / 60.0);
else window.requestAnimationFrame(animate);
您还提到检查window.top != window.self
是否检查窗口是否处于活动状态。事实并非如此,它会检查窗口是否在(i)帧中运行。
此外,您只使用此检查一次(并且仅在不支持requestAnimationFrame的情况下,因此如果第一次它不是真的,您将永远不会获得更新。
您可以使用支持https://caniuse.com/#search=hidden
的!Browser.document.hidden
属性
var window = Browser.window;
if (window.requestAnimationFrame == null) window.setTimeout(animate, 1000.0 / 60.0);
else window.requestAnimationFrame(animate);
我建议使用此代码段。并在动画函数中使用if (Browser.document.hidden) return
答案 1 :(得分:1)
好的,我找到了解决方案。来自kha的SystemImpl请求requestAnimationFrame并检查每个时间戳是否为null。
var window: Dynamic = Browser.window;
if (requestAnimationFrame == null) window.setTimeout(animate, 1000.0 / 60.0);
else requestAnimationFrame(animate);
在非活动选项卡中,requestAnimationFrame不为null,但不会调用animate函数。我添加了静态bool值isFocused,每次浏览器关闭或打开此窗口时都会更改。
为了解决这个问题,我暂时将这个小片段修改为:
var window = Browser.window;
window.onfocus = function(){isFocused = true;}
window.onblur = function()
{
window.setTimeout(animate, 1000.0 / 60.0);
isFocused = false;
}
if (requestAnimationFrame == null || !isFocused) window.setTimeout(animate, 1000.0 / 60.0);
else requestAnimationFrame(animate);
这样我就可以检查当前窗口是否是活动窗口并使用更平滑的requestAnimationFrame,如果不是,我使用setTimeout。回调方法是设置聚焦值。 Blur Callback值还确保在模糊时始终调用animate函数。
我将在即将到来的1或2周内提出这个解决方案来抢劫,也许他会考虑实施