我发现很难在 Unity 中为简单的 websocket 客户端找到一个简单可靠的库。WebSocketSharp(即https://github.com/sta/websocket-sharp)看起来不错,但许多项目无法解释。
当收到的消息到达时,
wssharp_connection.OnMessage += (sender, e) =>
{
if (!e.IsText) { return; }
Debug.Log(">> OnMessage, " + e.Data);
Handle(e.Data);
// but wait, not the main Unity thread??
};
void Handle(string msg)
{
.. your conventional Unity call, in a monobehavior
}
测试表明它似乎到达(总是?有时?)不是主要的 Unity 线程。
有人知道吗
事实上它总是不是主线程,还是可以变化?
如果总是另一个线程,实际上它总是同一个线程,还是变化/很多?
由于每个使用 websocket 客户端的 Unity 应用程序都必须这样做,我很惊讶没有 100 多个关于如何处理传入消息的讨论,包括在 WebSocketSharp 页面上,
但这就是我要做的,就像在 Unity 这样的基于帧的引擎中处理“线程”的通常方式:
wssharp_connection.OnMessage += (sender, e) =>
{
if (!e.IsText) { return; }
incoming_messages.Enqueue(e.Data);
};
// and ...
ConcurrentQueue<string> incoming_messages = new ConcurrentQueue<string>();
void Update()
{
if (incoming_messages.TryDequeue(out var message))
{
Handle(message);
}
}
那么那么
- 在 Unity 内部使用时,这确实是处理 WebSocketSharp 中的线程问题的常用方法吗?
鉴于有数十亿个带有 websockets 客户端的 Unity 应用程序,这一定是一条非常成熟的道路。