Unity的任务系统允许您创建多线程代码,以便您的应用程序可以使用所有可用的CPU核心来执行您的代码。这提供了更好的性能,因为您的应用程序能够更有效地利用正在运行的CPU核心的容量,而不是在单个CPU核心上运行所有代码。
您可以使用任务系统本身,但为了提高性能,还应该使用专为Unity任务系统编译任务的Burst编译器。该编译器提高了代码生成效率,从而提高了性能,并降低了移动设备上的能耗。
您还可以将任务系统与Unity的实体组件系统一起使用,以创建高性能面向数据代码。
Unity使用其自己的本地任务系统来处理在其应用程序运行的设备的多核心上的多个工作线程,这些线程的数量取决于可用的CPU核心数量。通常Unity在默认程序开始时在一个线程上执行您的代码,称为< strong>主线程。但是,当您使用任务系统时,Unity将通过工作线程执行您的代码,这称为< strong>多线程。
多线程利用了CPU在多个核心上同时处理大量线程的能力。在任务或指令一个接一个执行的情况下,它们是同时运行的。工作线程相互并行运行,并在完成后与主线程同步其结果。
任务系统确保只有足够的线程来匹配CPU核心的容量,这意味着您可以根据需要调度大量任务,而无需具体知道有多少CPU核心可用。这与其他依赖于诸如线程池等技术的任务系统不同,这些技术更容易创建比CPU核心多的线程。
任务系统使用工作窃取作为其调度策略的一部分,以平衡分配给工作线程的任务数量。工作线程可能比其他线程处理任务的速度更快,所以一旦工作线程完成处理其所有任务,它就会查看其他工作线程的队列,然后处理分配给另一个工作线程的任务。
为了更容易编写多线程代码,任务系统有一个安全性系统,可以检测所有潜在的数据竞争条件,并保护您免受可能由此引起的错误的影响。数据竞争发生在操作的输出依赖于其控制的另一个过程的时间。
例如,如果任务系统从主线程将您的代码中的数据引用发送到任务中,它无法验证主线程是否正在读取数据,同时任务正在写入它。这种情况就会产生数据竞争。
为了解决这个问题,任务系统为每个任务发送它需要操作的数据的副本,而不是主线程中数据的引用。这个副本将数据隔离开,消除了数据竞争。
任务系统复制数据的方式意味着一个任务只能访问可移动数据类型。这些类型在传递于托管和本地代码之间时不需要转换。
作业系统使用memcpy来复制可移动类型,并在Unity的可管理部分和本地部分之间传输数据。在安排作业时,它使用memcpy将数据放入本地内存,并在执行作业时允许可管理方访问该副本。有关更多信息,请参阅安排作业。
除了核心Unity引擎中提供的作业系统之外,集合包还扩展了许多作业类型和本地容器。有关更多信息,请参阅集合文档。