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