bounty还有6天到期。回答此问题可获得+50声望奖励。ultraGentle正在寻找典型答案。
我在一个web worker中使用以下代码来调度事件,使其精确间隔10 ms。
这似乎适用于所有浏览器,除了任何iOS浏览器。(桌面Safari很好。)
<script id="masterClock" type="javascript/worker">
let onmessage = function (event) {
let delay = 10; // milliseconds
let time = Date.now();
while (Date.now() < time + delay) { }; // waits 10ms increments in all browsers except mobile Safari
postMessage({data: []});
};
</script>
任何建议/解释赞赏!
编辑:
- 我尝试使用基于
setTimeout
的计时器,但它太不精确了,对iOS一点帮助都没有。 - 我尝试了基于
requestAnimationFrame
的替代计时器,但它在iOS中也不一致。 - 我考虑过使用
AudioContext
,但我不想预先安排所有事件,因为用户会在事件发生时与它们交互;但也许它可以作为计时器
1条答案
按热度按时间wvt8vs2t1#
由于iOS设备可能具有电源管理功能,可以在后台或屏幕关闭时限制或降低JavaScript执行的优先级(如this thread所示),因此您可能需要考虑另一种后台任务机制。
尝试一个Web API Worker,它会调用你的javascript循环:
你的剧本:
但如果问题仍然存在,那么是的,音频工作者更精确。由于您需要保持交互,因此考虑使用Audio Worklet API,它用于提供自定义音频处理脚本,这些脚本在单独的线程中执行,以提供非常低的延迟音频处理。
如文档所示,您需要:
1.扩展
AudioWorkletProcessor
类(参见“派生类”一节)并在其中提供您自己的process()
方法;1.使用
AudioWorkletGlobalScope.registerProcessor()
方法注册处理器;1.在音频上下文的
audioWorklet
属性上使用addModule()
方法加载文件;1.基于处理器创建AudioWorkletNode。处理器将由
AudioWorkletNode
构造函数在内部示例化。创建一个
audio-worklet-processor.js
:您可以从
worker.js
注册它:打电话给你的员工: