• 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#使用,主要功能可以使开发中更安全的编写多线程的代码,并且可以提示处理中的错误。此功能的使用以后再补充。

      

  • 相关阅读:
    MyEclipse2014中SVN的使用方法
    使用Navicat V8.0创建数据库,外键出现错误ERROR 1005: Can’t create table (errno: 121)
    个人简历
    Android Studio集成SVN报错:can't use subversion command line client : svn
    面向对象原型的七种方法详解(前)
    js中return的用法
    面试题总结
    Ajax 是什么?Ajax 的交互模型?同步和异步的区别?如何解决跨域问题?以及 HTTP状态码
    css3实现的3中loading动画效果
    CSS3绘制弹球动画效果
  • 原文地址:https://www.cnblogs.com/litmin/p/8821648.html
Copyright © 2020-2023  润新知