【问题标题】:Triggering an action on multiple devices at the same time同时触发多个设备上的操作
【发布时间】:2019-11-10 17:58:28
【问题描述】:

我正试图在多个设备上同时(或以尽可能低的延迟/偏移)在我的 Android 应用中触发一个操作。

这些设备非常相似(品牌、型号、版本),通过 USB 插入 Macbook Pro。到目前为止,我有 4 台设备,但最终的解决方案将包括更多设备,因此我需要一个适用于很多设备的解决方案。

我曾尝试在 Wifi 和 USB 上使用套接字(Socket.io 和常规 WS),但每个设备的延迟略有增加,因此不会同步触发操作。

我还尝试通过 USB 发送广播 UDP 数据包,这会产生更好的结果,但似乎非常不一致:最大延迟从 10 毫秒变为 100 毫秒。

同步时钟是我正在考虑的另一个选择,但不确定它在许多设备上的准确度(而且 NTP 在 Android 上似乎很棘手)

有什么想法或模式可以解决这种要求吗?谢谢!

编辑

所以在做了一些测试之后,最准确的选择是按照 Sam Mason 的建议使用 NTP 同步设备时钟(我使用的是 this library)。我设法在我的 4 台设备之间实现了平均 5 毫秒的转换。

【问题讨论】:

  • 这听起来像是多播的工作,但请记住,广播和多播对于 Wi-Fi 来说是有问题的,因为它必须以最低的速度发送,以便远距离的客户端也能接收到它。一些 WAP 被配置为将其更改为单独的单播,并将它们串行发送。在有线网络或未配置为将广播/多播更改为单播的 Wi-Fi 上,每个主机将同时接收数据包。由于接收主机内部的延迟,可能会出现差异。

标签: android networking websocket synchronization udp


【解决方案1】:

首先进行一些观察:

  1. 移动设备往往会主动关闭 NIC 以节省电量(我不确定它们当前是否正在充电会影响多大)
  2. 如果它们没有被使用,它们还会限制它们的 CPU 频率,并且可能需要一段时间(即毫秒)才能让它们恢复速度。鉴于您的设备都是“相同的”,您的测量结果可能会受到其他也在运行的应用的支配
  3. 测量应用程序响应的延迟似乎并非易事,通过网络执行此操作可能会增加差异,因为所有设备都在相互竞争(请注意,USB 是“串行总线”,因此这也适用于此)。取决于这有多重要,可能值得设置摄像机并观看他们的屏幕

也就是说,我很想依靠他们的时钟来做到这一点。 NTP 同步可能很棒(例如,亚毫秒精度很容易)但可能不适用于移动设备(我假设 Android NTP 客户端更关心电源,任何小于几秒的时间对人类来说都很好)。也就是说,他们的时钟应该相当稳定,所以让您的客户签入(随机签入以减少网络争用,并执行几次以使 NIC 正确启动)。客户端可以使用它来计算距离“事件”还有多长时间,然后在此之前的几毫秒内休眠。然后他们可以唤醒并进行忙碌循环检查时间(以确保 CPU 已上电),然后在适当的时间继续

【讨论】:

  • 感谢您富有洞察力的回答,我一定会尝试使用时钟/NTP 方法并报告回来。到目前为止,我测量延迟的方法是将所有设备指向另一部显示计时器并触发每个设备的摄像头以获得“视觉时间戳”的手机。相机(通过 API)设置为手动,以禁用所有默认的自动调整例程,并将快门速度增加到较高值。我想知道这种方法是否还会引入可能会产生错误结果的随机延迟。
  • 屏幕通常以 60hz 更新,而设置和拍摄全传感器照片的延迟将远远超过 17ms。拍摄高帧率视频可能会更好,但也会涉及缓冲/不可预测的延迟,因此除非硬件为帧加时间戳(显然有些人这样做)我认为显示更可预测。请注意,android 会缓冲屏幕更新(不确定是两倍还是三倍),但这应该是一个固定的延迟,因此您可以在 +-8ms 内进行测量。 danluu.com/input-lag 可能会很有趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多