Unity 异步编程

原文地址在这里

在现在的游戏开发中,很多逻辑需要并发或者并行的实现,而且现代CPU大多都是多核的,如果能充分利用多核CPU的优势,降低主线程的压力,游戏的性能将会大大提高。下面介绍三种在Unity中实现异步编程的方法。

一,协程

协程不是多线程,它还是在主线程上执行的,但协程可以将一个函数分成多个部分来顺序执行,从而实现等同并发的处理方式。但协程不是并行的,并发和并行的区别:并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。

在使用协程时要特别注意它们的调用时机。

对于不同的yield return条件,协程调用的时机也不一样:

  • 如果是waitforseconds就会在update之后调用。

  • 如果是waitforendofframe就会在一帧的最后调用。

  • 如果是waitforfixedupdate,就会在物理帧的最后调用。

C#编译器会帮我们创建一个协程的类,而在开启一个协程时就会创建对应的对象,这个对象用来维护多次调用时协程的状态。正是要维护这些状态,所以协程内的本地变量也需要放到堆上,协程函数内的临时变量会变成类的成员变量,启动一个Coroutine所引起的内存消耗等同于一个类的固定成本加上这个 Coroutine所用到的局部变量总内存。而协程的生命周期就是跟着MonoBehaviour来走的。

需要注意的是:

  • 为了减少主线程的CPU开销,需要避免在协程内进行一些阻塞的操作;
  • 在协程内分配的资源要在协程结束以后才会释放,所以不要在协程内循环分配资源;
  • 尽可能使用最少的协程数去完成最多的操作;
  • 使用巢状式的协程有助于保持代码简洁且易于维护,但它们也比较容易导致较高的内存开销。

二,C# 线程

线程是并行的,协程是并发的,C#的线程是基于.Net的实现,Mono进一步细分操作系统的进程到一个轻量级的托管子进程,这就是AppDomain。而在AppDomain中又可以存在一个或者多个的托管线程,也就是Sytem.Threading.Thread。

托管线程并不需要映射到单独的原生线程上;

原则上,托管线程就是虚拟的;System.Threading.Thread.CurrentThread.ManagedThreadId返回的是托管线程ID,ID是稳定的;

System.AppDomain.GetCurrentThreadId()返回的是原生线程ID,ID是不稳定的。

注意:Unity的API不是线程安全的,所以不能在C#线程上调用Unity的API。

千万不要在Unity的主线程上使用线程暂停的相关操作。

三,Unity C# job system

这是Unity的一个新特性,是把Unity job system开放给C#使用,主要功能可以使开发中更安全的编写多线程的代码,并且可以提示处理中的错误。此功能的使用以后再补充。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值