Unity是一个非常流行的游戏引擎特别是其全面且易于使用的编辑工具。
但是,引擎必须跟随机器的发展:十年来,处理器的频率并没有增加,而是增加了内核数。 换句话说, 要利用新的可用性能,游戏必须在不同的内核上运行其代码, 通过不同的线程。
但是,从技术可用的那一刻起,很少有游戏真正成功。 实际上,编写此类代码的问题很多。
为了避免这些缺点,可以遵循一些规则。 这是Unity使用C#开发名为Burst的新编译器的原因之一。 如果不遵守这些规则,将会发生编译错误。
为了达成这个, 该代码应作为要执行的任务的集合编写。 这些任务中的每一个 对数据执行一些转换。
程序员必须指定他可以只读访问的存储区以及要向其读取和写入数据的存储区-编译器将确保您在这些声明之外不使用任何东西。
然后,调度程序将使用这些附加信息来确定实时完成这些任务的最佳方法:例如,您可以确保没有任务将数据写入其他人试图读取或写入的位置。
突发不仅旨在促进并行编程:还用于最关键的部分 (从性能的角度来看)Unity代码。
到目前为止,这些都是用C ++编写的,但是当前的编译器并不完全令人满意。
事实上, 如果开发人员希望对循环进行矢量化处理,则不能保证编译器会执行以下操作: 例如,由于两个向量之间的加法,编译器必须正式证明在所有可能和可想象的情况下,两个向量都不对应于内存中的相同地址。
为什么使用Burst而不使用现有的编译器?
如果不对循环进行矢量化处理,则性能是关键点,这是一个需要快速解决的实际问题。
另外, 考虑到缓冲区溢出错误,生成的二进制文件应该是安全的 应该尽快发现危险的参考,并使用实际的错误消息而不是未定义的行为(这会导致许多安全问题)。
面对这些提出的需求, 您仍然需要选择此编译器的输入语言-C,C ++,C#的变体或子集还是新语言?
一种新的语言不是一个好的选择,因为起初您避免使用此新工具来培训人员。
从用户的角度来看,C#具有优先权, 由于游戏引擎已经使用了它,因此将以与游戏相同的语言进行编码。
另外, C#已经有一个非常大的生态系统,相反,C ++仍然受C的影响尽管不确定性能,但C ++ 20并不能始终消除明显的内含物,并且需要大量的编译时间,因此C ++ XNUMX可以部分修复这些缺陷。
决定继续使用C#,但是删除了一些影响性能的项目,例如标准库,主要是垃圾收集和权限。
由于Burst不需要大量的代码作为输入,而仅是关键循环的入口,因此Burst不能真正用作完整的编译器。
它只是将其编译为函数以及它调用的所有内容。 优化级别非常高:由于Burst专注于代码的某些部分,因此可能会花费一些时间。
Unity 2018.1附带Burst的第一个迭代,其中包含HPC#和任务系统。
生成的代码有时比C ++中的先前版本更快,有时甚至更慢,但是开发人员相信,它们始终将至少达到与C ++相同的性能水平。
数据来源: 博客.unity3d.com