我正在使用Unity游戏接收来自Muse EEG耳机的OSC消息。我已经尝试了两个第三方C#库来处理OSC通信,UnityOSC
和unity-OSC-receiver
。两者都实现了与底层System.Net.Sockets.UdpClient
的OSC通信。一切都在Windows上顺利运行,但在OSX上,过了一段时间,我每次都停止接收消息。没有例外或错误消息,根本没有出现问题的迹象,只是沉默。
我的申请大致如下:
process.WaitforExit()
MonoBehavior.Update()
,这不够快 - 继续接收和处理OSC消息。在这两个库中,这基本上归结为调用UdpClient.Receive()
初始化连接后大约120到140秒,消息流就停止了,到目前为止,我还没有找到原因。耳机上的连接指示灯保持亮起,但没有任何迹象表明它实际上仍在发送数据。
我排除的事情:
我怀疑Mono,Unity或OSX可能正在关闭(垃圾收集?)Muse-IO进程或线程,因为无论我尝试什么,问题发生前的时间似乎都非常不变。但我不确定如何进一步诊断,更不用说现在解决这个问题了。任何线索,建议或惊人的解决方案都是最受欢迎的。
答案 0 :(得分:0)
我找到了原因。
产生I / O进程后,线程会执行
print("Process started!");
process.PriorityClass = ProcessPriorityClass.High;
process.WaitforExit();
事后来看,那份印刷声明确实很糟糕,哦。它在Windows上运行良好。如果您将其增加到实时according to the docs,则更改流程优先级只需要管理员权限。虽然在Mac上不是这样。显然将其设置为高还需要提高OSX的权限。结果异常是静默/未检测/未被捕获,因为它发生在主线程之外。
然后,几分钟后,似乎线程被垃圾收集,包括其子进程,即使它仍然在运行。这种延迟真的让我失望,让我在所有错误的地方寻找原因。
经验教训: