Haxe非活动浏览器选项卡完全停止

时间:2017-08-31 07:23:23

标签: web haxe tabbed kha

我正在开发一款基于浏览器的haxe游戏。只要我将浏览器选项卡作为我的活动选项卡,一切都按照预期和顺利进行,但只要我切换选项卡(无论我是否使用chrome或firefox)它都会完全停止工作并且不会发送任何选项卡心跳到我的服务器。

我知道,非活动标签的性能会降低,我也知道,不允许非活动标签加载资源。 (我的游戏不这样做。)

我希望我的游戏在处于非活动状态时继续运行,更重要的是,我希望它能够向服务器发送心跳。

有什么办法可以强制执行吗?

我正在使用Kha和Haxe,我尝试了haxe原生调度程序用于心跳和kha调度程序,它们都不起作用。

2 个答案:

答案 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周内提出这个解决方案来抢劫,也许他会考虑实施