C# 为什么我在Mac上使用一段时间后不再接收OSC消息?
我正在开发一款Unity游戏,它可以从Muse EEG耳机接收OSC信息。我尝试了两个第三方C#库来处理OSC通信,以及。两者都实现了与底层C# 为什么我在Mac上使用一段时间后不再接收OSC消息?,c#,macos,unity3d,udpclient,osc,C#,Macos,Unity3d,Udpclient,Osc,我正在开发一款Unity游戏,它可以从Muse EEG耳机接收OSC信息。我尝试了两个第三方C#库来处理OSC通信,以及。两者都实现了与底层System.Net.Sockets.UdpClient的OSC通信。在Windows上,一切都运行得很顺利,但在OSX上,过了一段时间,我每次都不再接收消息。没有异常或错误消息,没有任何错误指示,只有沉默 我的应用程序大致如下所示: 启动一个线程,生成一个运行Muse IO的进程。这会使耳机开始发送信息。启动该进程后,该线程正在process.Waitf
System.Net.Sockets.UdpClient
的OSC通信。在Windows上,一切都运行得很顺利,但在OSX上,过了一段时间,我每次都不再接收消息。没有异常或错误消息,没有任何错误指示,只有沉默
我的应用程序大致如下所示:
- 启动一个线程,生成一个运行Muse IO的进程。这会使耳机开始发送信息。启动该进程后,该线程正在
process.WaitforExit()
- 另一个线程运行while循环—不在
,速度不够快—它一直在接收和处理OSC消息。在这两个库中,这基本上归结为调用monobhavior.Update()
UdpClient.Receive()
- 游戏在正常的Unity更新周期中使用处理过的消息
- 这不是因为消息的数量或消息的大小。如果我修改对耳机的命令,只发送某些类别的信息,将总数减少一半(从大约600/s减少到300/s),超时仍然会同时发生
- 这不是OSC图书馆。我在两个OSC库中得到了完全相同的结果
- 这不是防火墙。防火墙关闭了
- 它可能不是被其他东西使用的端口。我尝试了不同的端口,结果相同
- 它似乎不是Muse的OSX驱动程序。当我使用他们的GUI来可视化传入的数据时,它会一直接收我想要的数据
print("Process started!");
process.PriorityClass = ProcessPriorityClass.High;
process.WaitforExit();
事后看来,那份书面声明的位置真的很糟糕。它在窗户上工作得很好。更改进程优先级仅需要管理员权限(如果要将其增加到实时)。但在Mac上不是这样。显然,将其设置为高还需要提高OSX的权限。产生的异常是静默的/未检测到的/未捕获的,因为它发生在主线程之外
然后,几分钟后,线程似乎被垃圾收集,包括它的子进程,即使它仍在运行。那次耽搁真的把我甩了,让我在所有错误的地方寻找原因
经验教训:
- 在进行多线程处理时,请更加小心可能出现的异常
- 如果不一定非要,请不要干扰流程优先级
- 永远不要相信医生