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()里取出处理结果。

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值