技术概述
2021年10月27日18:54
Unity 的多线程面向数据的技术堆栈于 2017 年推出,依靠三项重要创新,它提供了令人难以置信的性能改进:
The Entity Component System,它以缓存友好的方式在内存中布置数据。
The Job System,它支持在多个CPU上并行工作。
The Burst Compiler,它使用LLVM生成急速的矢量化代码。
1)实体组件系统
面向数据的设计
Unity DOTS的核心是面向数据的设计理念。 它的目标是组织数据以进行高效处理,以便尽快将数据提供给CPU。
缓存优化
现代CPU的处理速度如此之快,瓶颈往往是CPU寄存器和计算机RAM之间的带宽和延迟。 为了解决这个问题,CPU包含多个高速缓存级别。
当 CPU 需要一个值时,它首先在缓存中查找它,然后再尝试从RAM 中访问它。 高速缓存离寄存器越近,访问速度越快,但相应的内存越小。
现代CPU不是逐字节访问内存,而是以64字节为单位访问内存,这称为缓存行。 当计算机试图读取一个特定的内存位置时,整个缓存行都会被读取,这意味着从同一缓存行访问其他值非常快。 但是,如果当前计算不需要缓存行中的其他值,则会发生缓存未命中,从而显着减慢进程。因此,根据数据的访问模式来安排内存中的数据,可以明显提高性能。
实体组件系统
实体组件系统 (ECS) 通过将数据与逻辑分离,在实践中应用面向数据的设计范例。 它由实体、组件和系统组成。
实体
一个实体是一个标识符; 它不存储数据或逻辑,而是标识哪些数据属于一体。 这与传统的面向对象编程相反,在传统的面向对象编程中,每个实体都包含自己的数据。
组件
一个组件包含一组数据。 它可以被附加到一个实体,该实体还可以包含其他组件。 每个组件中存储哪些数据取决于访问数据的方式:如果两个值总是一起被访问,那么它们通常应该存储在同一个组件中。
系统
系统提供转换组件数据的逻辑,通常包含一个游戏方面的功能(例如,HP系统将添加或减少生命值)。 每个系统都定义了它需要读取和写入的组件。
2) Jobs System
多线程的并行化算法已经存在了很长时间了。然而,Unity DOTS的新工作系统提供了一个接口,可以轻松地将代码并行化并与主线程同步数据。它将直接的线程处理从开发者那里抽象出来,而将每个Job排在一个中央调度器上,当有线程可用时就执行它。最重要的是,Unity已经开发了自动的race condition checks。当一个线程在向数组写入数据时,另一个线程同时试图读取相同的数组时,就会出现Race Condition。众所周知其难以调试。
3) Burst编译器
性能提升的一个重要来源是在底层级优化代码,这种优化通常需要用C++或C等语言编写代码,这些代码可以直接在处理器上执行。 多亏了Burst编译器,C#代码可以转换为高度优化的机器代码,这些代码被设计为在特定计算机的任何处理器上原生运行。
暂无关于此日志的评论。