【问题标题】:How to process a Queue in Unity3D?如何在 Unity3D 中处理队列?
【发布时间】:2016-09-02 09:52:45
【问题描述】:

我在我的游戏中实现了System.Collections.Queue 来收集所有传入的 TCP 消息。

现在,我只是在Update() 中处理Queue 中最旧的消息(如果队列不为空)

但是,两帧之间的时间通常比处理消息所用的时间长。

我想知道是否有一种方法可以在前一个消息完成时处理消息,而不会冻结游戏。

我尝试过使用协程,但它没有任何改变,因为 yield return null; 似乎在等待下一帧(所以它就像一个 Update())。

【问题讨论】:

  • 如果不发布您的 TCP 代码,就很难判断您做错了什么。
  • 消息只是可以随时到达的信息。有时一秒钟可能有一百多条消息,Unity需要一一处理。但我不能在每个之间等待 1/60 秒
  • 使用某种线程在后台处理消息或使用 TCP 类提供的异步方法而不是排队。
  • 再一次,没有看到你的代码,我不知道发生了什么。我要求提供代码,因为我感觉您是在主线程中执行此操作,这会减慢 Unity 甚至在从服务器读取时冻结。就像 null 说的那样,您必须在另一个线程中执行此操作或使用异步函数。

标签: c# multithreading unity3d queue coroutine


【解决方案1】:

您可以实现CustomYieldInstruction 以等待您的消息到达:

class WaitWhileMessageArrives: CustomYieldInstruction 
{
    Func<bool> m_Predicate;

    public override bool keepWaiting { get { return m_Predicate(); } }

    public WaitWhileMessageArrives(Func<bool> predicate) { m_Predicate = predicate; }
}

像这样使用它:

(注意:此代码只是给出基本概念的示例,因为您尚未提供代码)

IEnumerator ProcessMessages()
{
    while(yourQueue.Count != 0)
    {
        Message msg = yourQueue.Dequeue();
        yield return new WaitWhileMessageArrives(() => msg.processed);
    }
}

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2014-01-14
    • 2012-07-06
    • 2023-02-10
    • 1970-01-01
    • 2021-04-29
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多