美文网首页Unity3d游戏开发
Unity3d UI线程与其它线程之间的交互

Unity3d UI线程与其它线程之间的交互

作者: 王广帅 | 来源:发表于2020-02-02 13:28 被阅读0次

在使用Unity3d开发游戏的时候,UI相关的操作只能在主线程(main)中操作,在别的线程中无法直接操作UI。在游戏开发的过程中,有些阻塞的操作是不能直接在主线程中实现的,因为它需要的时间可能会很长,所以一般都是放到一个新的线程中实现的。比如网络请求和响应线程,比如资源异步加载线程,热更新线程等,这就会出现的UI线程与网络线程的交互,及UI线程与其它线程间的交互。
在.net中,有一个类专门实现了跨线程的数据交互,比如在网络线程中,收到服务器的返回消息时,需要回调UI的更新线程,大部分都昌使用队列进行数据交互,现在可以通过使用SynchronizationContext直接调用UI的回调方法。

  1. 获取UI线程的SynchronizationContext的实例
    在UI线程调用异步方法时,可以在UI线程中直接使用
SynchronizationContext.Current

获取当前UI线程的SynchronizationContext 实例。

  1. 调用回调方法
    在SynchronizationContext类中有两个方法,一个是Send方法,一个是Post方法。
  • Send() 是简单的在当前线程上去调用委托来实现(同步调用)。也就是在子线程上直接调用UI线程执行,等UI线程执行完成后子线程才继续执行。
  • Post() 是在线程池上去调用委托来实现(异步调用)。这是子线程会从线程池中找一个线程去调UI线程,子线程不等待UI线程的完成而直接执行自己下面的代码。
    所以在使用异步方法的时候,需要把SynchronizationContext的实例传过去,在调用UI回调方法时,使用Send方法调用,如下面代码所示:
 public void ConnectServer(Action<SocketStateEnum> callback)
    {
        //异步执行socket的连接
        networkStatusExecutor.Execute(() =>
        {
            try
            {
                Debug.Log("开始连接服务器:" + host + ":" + port);
                clientSocket.ConnectServer();
                Debug.Log("连接服务器成功:" + host + ":" + port);
                //使用UI线程的SynchronizationContext实例调UI的回调
               uiContext.Send((state) =>
                {
                    Debug.Log("连接成功之后回调线程:" + Thread.CurrentThread.ManagedThreadId);
                    callback.Invoke(SocketStateEnum.ConnectSuccess);
                }, null);
                //启动异步接收数据
                receiveExecutor.Execute(() =>
                {
                    messageReader.ReadData((byteBuf) =>
                    {
                        serverMessageDispatch.DispatchMessage(byteBuf);
                    });
                });
            }
            catch (Exception e)
            {
                uiContext.Send((state) =>
                {
                    callback.Invoke(SocketStateEnum.ConnectFailed);
                }, null);
                Debug.Log("网络连接失败,请检测网络," + e);
            }
        });
    }

这个是一个异步连接socket的代码,在连接成功之后,可能会更新一些UI上面的展示,所以使用UI的SynchronizationContext调用回调方法。


欢迎关注,获取更多资源

相关文章

  • Unity3d UI线程与其它线程之间的交互

    在使用Unity3d开发游戏的时候,UI相关的操作只能在主线程(main)中操作,在别的线程中无法直接操作UI。在...

  • Android-消息处理机制Handler

    有的没的 主线程:也叫UI线程,或称为ActivityThread,用于运行四大组件和处理与用户之间的交互,A...

  • 消息通信

    为什么需要消息通信? Android的主线程即UI线程是非安全线程,只允许UI线程更新UI状态。其它任务线程处理完...

  • GCD几种组合的使用

    ### GCD常用队列 主线程:UI操作在这条线程上而已,这是主线程和其它线程的区别.主线程 挂掉不会影响其它线程...

  • Android线程与消息机制

    OUTLINE §UI线程 §Looper §消息机制 §线程交互 §AsyncTask §Activity/Se...

  • handler

    Handler机制:用于在工作线程与UI线程之间进行消息传递的机制。(因为工作线程不能直接操作UI组件的属性值) ...

  • 安卓面试笔记

    OKhttp线程池策略,线程池丢弃策略,jsbridge原理与native交互过程,okhttp源码,子线程之间通...

  • Android线程和线程池

    主线程与子线程 主线程:主线程主要处理UI交互,需要在任何时候都有较高的响应速度,否则界面会产生卡顿。主线程中不能...

  • android整理之handler源码解析

    Handler handler机制提供主线程与主线程的通讯,主线程与子线程之间可以互发消息进行相应的数据UI更新。...

  • 多线程系列第(八)篇---Android中的线程

    主线程和子线程 主线程,又叫UI线程,主要作用是运行四大组件以及处理它们和用户的交互。子线程也叫工程线程,主要作用...

网友评论

    本文标题:Unity3d UI线程与其它线程之间的交互

    本文链接:https://www.haomeiwen.com/subject/apqqxhtx.html