Unity中的多线程

Unity中的多线程

切换到主线程

	方法1: 使用unity内置的 UnitySynchronizationContext
		public class SyncContextUtil
		{
			//	在一个保证在主线程上运行的函数中保存 UnitySynchronizationContext
			[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
			static void Install()
			{
				UnitySynchronizationContext = SynchronizationContext.Current;
			}

			public static SynchronizationContext UnitySynchronizationContext
			{
				get; private set;
			}

			//	实现Unity的多线程调度器
			public static void RunOnUnityScheduler(Action action)
			{
				//	用 Send 则如果当前是主线程会直接运行,否则加入队列
				//	用 Post 则直接加入队列
				UnitySynchronizationContext.Send(_ => action(),null);
			}
		}
	方法2 使用 Loom 这个库
		可以网上下载 Loom.cs 插件 或者参考  ET 库中的 ThreadSynchronizationContext
		Loom.QueueOnMainThread((param)=>{}, param);

切换到渲染线程

	未开启多线程渲染时,渲染线程和主线程是同一个线程,不需要切换
	可通过 if (SystemInfo.graphicsMultiThreaded)  进行判断
	//	定义渲染线程的委托类型
	delegate void RenderEventDelegate(int eventID);
	
	//	定义在渲染线程执行的函数
	[MonoPInvokeCallback(typeof(RenderEventDelegate))]
    private static void RunOnRenderThread(int eventID)
    {
        if (eventID == 2)
        {
            Debug.Log("============= RunOnRenderThread eventID==2");
        }
    }
	
	//	委托转成 c指针
	RenderEventDelegate RenderThreadHandle = new RenderEventDelegate(RunOnRenderThread);
	IntPtr RenderThreadHandlePtr = Marshal.GetFunctionPointerForDelegate(RenderThreadHandle);
	
	//	向渲染线程注册一次回调,2是自定义的回调事件,相当于用户参数
	GL.IssuePluginEvent(RenderThreadHandlePtr, 2);

你可能感兴趣的:(unity,unity,游戏引擎)