簡體   English   中英

覆蓋非活動選項卡的setTimeout行為

[英]Override setTimeout behaviour for inactive tabs

我目前正在使用WebRTC在JavaScript中開發對等游戲。 它將對等方之一(即主機)視為服務器,其他任何對等方通過node.js代理服務器連接到主機。

我目前正在嘗試解決以下問題:如果主機切換選項卡,使得游戲不再是活動選項卡,則游戲停止為所有人更新。 經過研究后,我發現這是因為我使用的是:

setTimeout(callback, 1000 / 60);

在我的游戲循環中。 setTimeout(至少在我關注的瀏覽器Chrome和Firefox中)的定義是這樣的:如果調用它的頁面不在活動選項卡中,則每秒最多可以調用一次。

我讀到Web Workers沒有這個約束,但是為了完成這項工作,我需要在Web Workers中運行我所有的游戲邏輯。 我嘗試使用JSON.stringify()將游戲對象發送給工作人員,但它說該對象具有循環引用(在游戲循環中),並且無法將其轉換為JSON。 所以我不確定該怎么辦。

我也考慮實現自己的計時器,無論頁面是否處於活動選項卡中,計時器都將繼續運行,但是我也不知道如何執行此操作。

我不會通過這些方式,甚至我還沒有想到的其他方式來執行此操作,只要它不會造成很大的性能開銷。 任何建議將不勝感激。

因此,如上所述,Web Workers可以調用setTimeout(),而不會為不活動的選項卡延遲1秒。 然后,我的解決方案是創建一個Web Worker,該Web Worker只負責調用setTimeout()(在其onmessage事件偵聽器中調用)。 然后,在每個游戲循環結束時,我調用:

this.worker.postMessage(null)

可以說,賦予Web Worker更多的責任比僅調用setTimeout()更為有效,因為我已經添加了等待在主線程和worker之間發送消息的開銷。 這是我將來可能會看的東西。

這樣做的主要問題是與IE的兼容性。 IE直到10.0版才獲得對Web worker的支持。 這並不是我真正關心的問題,但我認為值得一提。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM