对Unity中的多线程的一些理解

大多数游戏引擎都是单线程的,Unity也不例外。
为什么使用单线程,原因主要为:

游戏中画面更新和逻辑更新的时间点必须有确定性,必须严格按照帧序列进行同步。当然,多线程也能实现,但是同步问题比较麻烦,会加大编程难度。


Unity中有大量的异步机制,比如:异步加载资源,异步加载场景。

SceneManager.LoadSceneAsync( "xxx" );  这段代码就是异步加载场景。(异步加载场景一般是在一个loading场景中进行,加载完成后再转换到异步加载好的场景中)

那么Unity中的异步加载是不是用多线程实现的呢?

答案不是,Unity中异步加载机制使用的协程来实现(对于协程和线程的具体分析,将在其他部分)。协程并不是线程,协程也是在Unity主线程中被调用的,调用的时机和次数,程序员可以通过编码确定。

那么在Unity中能不能使用多线程呢?

我在Unity中第一次用到多线程,是在学习客户端和服务器端Socket通信的时候,在建立socket连接之后,在客户端,使用了
BeginReceive这个方法(具体分析在其他部分),这个方法是在System.Net.Sockets中定义的。使用这个方法不用手动开启线程,这个方法使用的线程是用C#线程池实现的。

在Unity中合理的使用多线程,可以提高CPU的利用率
那么在哪些场景下才是合理的在Unity中使用多线程呢?

1.网络通信。
2.需要处理复杂算法的计算时。
3.复杂密集的I/O操作。
4. Unity3D的NativePlugin中可以新建子线程。通过NativePlugin可以接入移动端iOS与Android中的成熟库,可以是Objective C, Java, C++三种语言交叉混合的方式组成NativePlugin,然后使用Android或者iOS的SDK开辟子线程。(这里的知识我是直接复制别人的参考博客:https://www.cnblogs.com/yangxiaohang/articles/6505302.html,我并不是很了解,以后学习到的时候再补充。)

使用多线程时有一些限制:
1.UnityEngine中的API对象不能在子线程中使用。
2.UnityEngine总定义的基本数据结构可以使用,(如float,int,struct可以使用)。而texture2d不可以,因为它是根父类是UnityEngine.Object。
简单来说,就是不是画面更新,不是常规的逻辑更新。

这是我参考许多前辈的心得,加上自己理解写的,肯定有很多不足,欢迎指出错误。在我学习深入,有所得之后,我也会逐渐完善这些内容。

扫描二维码关注公众号,回复: 476430 查看本文章






猜你喜欢

转载自blog.csdn.net/lishengxu159/article/details/80097928