博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity 异步编程
阅读量:4557 次
发布时间:2019-06-08

本文共 1299 字,大约阅读时间需要 4 分钟。

  在现在的游戏开发中,很多逻辑需要并发或者并行的实现,而且现代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#使用,主要功能可以使开发中更安全的编写多线程的代码,并且可以提示处理中的错误。此功能的使用以后再补充。

  

 

转载于:https://www.cnblogs.com/litmin/p/8821648.html

你可能感兴趣的文章
果然逆天,处理一亿条int32数据排序,需要耗时32秒
查看>>
解锁Dagger2使用姿势(二) 之带你理解@Scope
查看>>
设计模式——抽象工厂模式详解
查看>>
十年,青春就是一转眼的事
查看>>
C++编程规范和各种资源
查看>>
两只小熊队高级软件工程第七次作业敏捷冲刺2
查看>>
[原创]如何编写多个阻塞队列连接下的多生产者多消费者的Python程序
查看>>
如何提高数据迁移和复制的速度
查看>>
.9图片
查看>>
android打开各种文件Intent
查看>>
[转][C#]单例模式之懒加载
查看>>
实验吧之【后台登录,加了料的报错注入,认真一点】(报错注入)
查看>>
MySQL无法存储Emoji表情问题
查看>>
HDFS集中式的缓存管理原理与代码剖析
查看>>
POJ1019 Number Sequence
查看>>
第十七章-异步IO
查看>>
Linux就该这么学
查看>>
out传值
查看>>
CentOS6.8【环境配置篇】
查看>>
线程同步的方式
查看>>