簡體   English   中英

React Native 中 setTimeout 的准確性

[英]Accuracy of setTimeout in React Native

我正在 React Native 中構建一個節拍器。 播放一次點擊后,我為下一次點擊設置了一個setTimeout 然而,時機很糟糕。

我做了以下快速測試:

let time = (new Date()).getTime() + 50;

setTimeout(() => {
  console.log(time - (new Date()).getTime());
}, 50)

理想情況下,我應該在控制台中得到 0。 在 Chrome Dev Tools 中的 React Native 之外運行它時,我得到 -1,有時 -2(毫秒)。 這是一個可以接受的結果。

在 macOS 上使用模擬器在 React Native 中運行它,我得到 0 到 -100 之間的值。 這顯然是不能接受的。

有人知道這是由於setTimeout的不准確還是(new Date()).getTime()的不准確嗎? 我可以解決這個問題嗎?

您為setTimeoutsetInterval配置的延遲不應被視為確切的延遲時間。 它們代表在執行函數之前您將等待的“最短”時間。 這是因為用戶代理在時間過去后將回調放入事件隊列,但如果用戶代理仍在處理其他任務,回調將留在那里。

您還應該知道,有一個內置的絕對最短時間,您永遠無法低於大約 9-14 毫秒。 這是由於用戶代理的內部結構。

我調查了幾乎所有用於播放音頻的 React Native 解決方案以及使用 javascript setTimeout()/setInterval() 的各種方法,但在時間穩定性和准確性方面,沒有一個是令人滿意的。

可能目前唯一的方法是將一些像這樣的本機模塊粘合: https : //developer.apple.com/library/content/samplecode/HelloMetronome/Introduction/Intro.html到 js 端,如 RN Docs 中所述: https://facebook.github.io/react-native/docs/native-modules-ios.html ,這給出了相當不錯的結果,但不幸的是,當然,它僅適用於 iOS。

暫無
暫無

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

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