天天看点

unity c# 子线程与主线程数据传递

    引言:在Unity里做AI大量模型运算处理,如果在update里进行处理会阻塞主线程,导致掉帧,这个时候需要单独开辟一个线程进行数据处理,缓解主线程处理压力。

应用了网友的一个处理方法,测试可用,整理一下,备忘。

using System.Threading;

//消息结构  
public class Message
{
   public ActionType type;//枚举类型
   public int p_number;//检测到的人数
   public byte[] byte_frame;
}

List<Message> messageList = new List<Message>();

//使用该方法在Unity的update里往外取数据
private void Dispatch()
{
    lock (((ICollection)messageList).SyncRoot)
    {
        if (messageList.Count > 1)
        {
            HandleMessage(messageList[1]);
            messageList.RemoveAt(0);
        }
        else//补帧
        {
           HandleMessage(messageList[0]);
         }
    }
}

//消息格式
 private void HandleMessage(Message message)
 {
     switch (message.type)
     {
         case ActionType.CV_8UC1:
             break;
         case ActionType.CV_8UC2:
             break;
         case ActionType.CV_8UC3:
             break;
         case ActionType.CV_8UC4:
             Texture2UI(message.byte_frame, message.p_number);
             break;
     }
 }

//开启线程
private void StartNewThread()
{
  Thread thread = new Thread(new ThreadStart(SubThread));
  thread .Start();
  Debug.Log("begin_thread.....");
}

//开启线程后这里会压数据
private void SubThread()
{
   while (mask_switch)//采集开关
   {
      if (messageList.Count < 200)//设置缓冲大小
      {
          int num_obj = xlsYolect.xls_get_num_boject();
          byte[] temp_byte = xlsYolect.xls_get_byte_frame();
          messageList.Add(new Message() { type = ActionType.CV_8UC4, p_number = num_obj, byte_frame = temp_byte });
      }
   }
}

           

总结:思路就是在Unity的脚本 Start() 里开启一个线程,线程中进行while 循环,用于处理计算量比较大的AI模型,处理完的结果压入自己开辟的缓冲区 List<Message>,然后在Update()里取出处理结果。