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

Haxe inactive browser tab stops completly

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

我知道,非活动选项卡的性能会变慢,而且我也知道,非活动选项卡不允许加载资源。 (我的游戏不会那样做)。

我希望我的游戏在不活动时继续,更重要的是,我希望它向服务器发送心跳。

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

我正在使用 Kha 和 Haxe,我尝试了用于 heartbeat 的 haxe 本机调度程序和 kha 调度程序,它们在处于非活动状态时都不起作用。

好的,我找到了解决方案。来自 kha 的 SystemImpl 正在请求 requestAnimationFrame 并在每个时间戳检查它是否为 null。

var window: Dynamic = Browser.window;    
if (requestAnimationFrame == null) window.setTimeout(animate, 1000.0 / 60.0);
else requestAnimationFrame(animate);

在非活动选项卡期间,requestAnimationFrame 不为空,但不调用动画函数。我添加了一个静态 bool 值 isFocused,每次浏览器关闭或打开时它都会更改 window.

为了解决这个问题,我暂时将这个小片段修改为:

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);

这样我会检查当前 window 是否处于活动状态 window 并使用更平滑的 requestAnimationFrame,如果不是,我将使用 setTimeout。回调方法正在设置 is focused 值。 Blur Callback 值还确保在模糊时始终调用动画函数。

我会在接下来的1、2周内把这个解决方案呈现给大家抢,也许他会考虑实施

你已经找到了,但我认为window.Top应该是window.top

如果你不使用:Dynamic,这样的东西会出错。 Window 是一个类型对象,你会得到很好的错误,这是严格类型语言的好处之一。 requestAnimationFrame 是 window 上的全局函数,因此此代码段无需动态注释即可运行。

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 会检查 window 是否处于活动状态。这不是真的,它检查 window 是否在 (i) 帧中运行。 此外,您只使用此检查一次(并且仅在不支持 requestAnimationFrame 时使用,因此如果第一次不正确,您将永远不会获得更新。

您可以使用 !Browser.document.hidden 属性,它得到了很好的支持 https://caniuse.com/#search=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