为什么我在Mac上暂时停止接收OSC消息?

时间:2015-11-10 20:53:25

标签: c# macos unity3d udpclient osc

我正在使用Unity游戏接收来自Muse EEG耳机的OSC消息。我已经尝试了两个第三方C#库来处理OSC通信,UnityOSCunity-OSC-receiver。两者都实现了与底层System.Net.Sockets.UdpClient的OSC通信。一切都在Windows上顺利运行,但在OSX上,过了一段时间,我每次都停止接收消息。没有例外或错误消息,根本没有出现问题的迹象,只是沉默。

我的申请大致如下:

  • 启动一个生成运行Muse-IO的进程的线程。这使耳机开始发送消息。在开始这个过程之后,这个线程只是在process.WaitforExit()
  • 上冷静下来
  • 另一个线程运行一个while循环 - 不在MonoBehavior.Update(),这不够快 - 继续接收和处理OSC消息。在这两个库中,这基本上归结为调用UdpClient.Receive()
  • 游戏在正常的Unity更新周期中使用已处理的消息。

初始化连接后大约120到140秒,消息流就停止了,到目前为止,我还没有找到原因。耳机上的连接指示灯保持亮起,但没有任何迹象表明它实际上仍在发送数据。

我排除的事情:

  • 不是因为消息的数量或消息的大小。如果我修改耳机的命令只发送一些类别的消息,将总数减少一半(从大约600 / s到300 / s),超时仍然会同时发生。
  • 它不是OSC库。我对两个OSC库都得到了完全相同的结果。
  • 不是防火墙。防火墙已关闭。
  • 可能不是其他东西使用的端口。我尝试了不同的端口,结果相同。
  • 它似乎不是Muse的OSX驱动程序。当我使用他们的GUI来显示传入的数据时,它会一直接收数据。

我怀疑Mono,Unity或OSX可能正在关闭(垃圾收集?)Muse-IO进程或线程,因为无论我尝试什么,问题发生前的时间似乎都非常不变。但我不确定如何进一步诊断,更不用说现在解决这个问题了。任何线索,建议或惊人的解决方案都是最受欢迎的。

1 个答案:

答案 0 :(得分:0)

我找到了原因。

产生I / O进程后,线程会执行

print("Process started!");
process.PriorityClass = ProcessPriorityClass.High;
process.WaitforExit();

事后来看,那份印刷声明确实很糟糕,哦。它在Windows上运行良好。如果您将其增加到实时according to the docs,则更改流程优先级只需要管理员权限。虽然在Mac上不是这样。显然将其设置为高还需要提高OSX的权限。结果异常是静默/未检测/未被捕获,因为它发生在主线程之外。

然后,几分钟后,似乎线程被垃圾收集,包括其子进程,即使它仍然在运行。这种延迟真的让我失望,让我在所有错误的地方寻找原因。

经验教训:

  • 多线程时可能会出现异常,
  • 如果你不是必须的话,不要把进程优先级搞得一团糟,
  • 永远不要相信文档。