问题描述
我发现很难找到一个简单的可靠库来在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应用程序都必须执行此操作,所以令我感到惊讶的是,关于如何处理传入消息(包括在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应用,这必定是一条颇为人知的道路。
更新的库...
BTW经过广泛调查,如果需要使用websocket客户端,则对于一个统一的应用程序而言,更现代的库https://github.com/Marfusios/websocket-client似乎更可靠/受支持。
解决方法
我在手机游戏中开发了一些非常大的游戏,我们使用Best HTTP来完成游戏,它绝对很棒-如果这是工作的话,那么您所获得的高质量功能就值得100%的价格。
实际上,我什至聘请了负责制作插件的人,以确保我们在库的某些部分没有任何错误,我什至亲自检查了他的代码,这是我最高的体系结构标准之一在资产商店中见过。 (顺便说一句,我们在所检查的代码的所有部分中都没有发现一个错误或内存泄漏)
关于使用队列并在Unity主线程上取队列;那绝对是100%正确的解决方法。我不确定您所指的插件中的具体实现;但是我非常有信心他们会为TCP连接打开一个线程。