关于unity中线程使用的小结

unity中允许开启多线程,但是由于unity引擎生命周期的关系,unity不允许辅助线程中运行unityAPI。

但是可以运行unity中的基本结构(int,Vector3,Quaternion等),并且Unity定义的基本类型的函数可以在分线程运行。

于是我们可以定义一个委托,在主线程中一直查询委托的情况,而辅助线程将需要进行的逻辑加载到委托中。主线程法线委托非空的时候,执行委托并且将委托清空。

这里实现一个简单的多线程辅助脚本来进行unity中多线程的使用。具体类图如图:


关于unity中线程使用的小结_第1张图片


脚本如下:


/// 
/// 线程交叉访问助手类
/// 
public class ThreadCrossHelper : MonoSingleton 
{
    /// 
    /// 延迟项
    /// 
    class DelayedItem
    {
        public Action CurrentAction { get; set; }

        public DateTime Time { get; set; } 

    }

    private List delayedActionList;

    public override void Init()
    {
        base.Init();
        delayedActionList = new List();
    }

    private void Update()
    {
        CheckDelayedActionList();
    }

    private void CheckDelayedActionList()
    {
        lock (delayedActionList)
        {
            //倒序删除
            for (int i = delayedActionList.Count - 1; i >= 0; i--)
            {
                //如果没有到达执行时间 则跳过
                if (delayedActionList[i].Time > DateTime.Now) continue;
                delayedActionList[i].CurrentAction();
                delayedActionList.RemoveAt(i);
            }
        }
    }
   
    /// 
    /// 执行需要在主线程调用的方法  由辅助线程调用
    /// 
    /// 需要执行的方法
    /// 延迟时间
    public void ExecuteOnMainThread(Action action, float time = 0)
    {
        lock (delayedActionList)
        {
            var item = new DelayedItem() { CurrentAction = action, Time = DateTime.Now.AddSeconds(time) };

            delayedActionList.Add(item);
        }
    }
}
在辅助线程中,只需要调用ExecuteOnMainThread()方法就可以实现

你可能感兴趣的:(unity技术)