1

我发现很难在 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 线程。

有人知道吗

  1. 事实上它总是不是主线程,还是可以变化?

  2. 如果总是另一个线程,实际上它总是同一个线程,还是变化/很多?

由于每个使用 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);
    }
}

那么那么

  1. 在 Unity 内部使用时,这确实是处理 WebSocketSharp 中的线程问题的常用方法吗?

鉴于有数十亿个带有 websockets 客户端的 Unity 应用程序,这一定是一条非常成熟的道路。

4

0 回答 0