1

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

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

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

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

我正在使用 Kha 和 Haxe,我尝试了 haxe 本地调度程序的心跳和 kha 调度程序,它们在不活动时都不起作用。

4

2 回答 2

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 时使用,因此如果第一次不正确,您将永远不会获得更新。

您可以使用该!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在动画功能中使用

于 2017-09-04T08:38:57.117 回答
1

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

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

在非活动选项卡期间,requestAnimationFrame 不为空,但不调用 animate 函数。我添加了一个静态布尔值 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 周内提出这个解决方案来抢,也许他会考虑实施

于 2017-09-01T14:01:06.457 回答