当前位置: 首页 > article >正文

Unity Dots理论学习-3.ECS有关的模块(2)

Burst编译器

如前所述,Unity中的C#代码默认通过JIT(即时编译)编译器Mono编译;或通过AOT(提前编译)编译器IL2CPP编译以提供更好的运行时性能,在某些目标平台上也会有更好的支持。

Burst模块提供了第三种编译器,它执行了大量优化,通常能带来比Mono甚至IL2CPP更好的性能。 使用Burst可以大大提高并行计算的性能和可扩展性,正如以下图像所示:

然而,需要注意的是,Burst只能编译C#的一部分代码,因此许多传统的C#代码无法通过它编译。主要的限制在于Burst编译的代码不能访问托管对象,包括所有的类实例。因为这个限制,Burst编译通常仅应用于代码的特定部分,例如jobs系统:

// The BurstCompile attribute marks this job to be Burst-compiled.
[BurstCompile]
struct MyJob : IJob
{
    public NativeArray<float> Input;
    public NativeArray<float> Output;
    public void Execute()
    {
        for (int i = 0; i < Input.Length; i++)
        {
            Output[i] *= Input[i];
        }
    }
}

正如在这段视频中所描述的,Burst的性能提升来自于:

  • SIMD的使用(SIMD是一种技术,用于在多个数据元素上同时执行相同的操作)
  • 更好地处理别名问题(当两个或多个指针或引用指向相同的内存位置),
  • 其他技术的应用。

Collections

Collections package提供了非托管collection类型,如列表和哈希表,这些类型经过优化,适用于job和Burst编译的代码。

所谓的“非托管”,意味着这些集合不由C#运行时或垃圾回收器管理;你需要显式地通过调用其Dispose()方法来释放不再需要的非托管collections。

由于这些collections是非托管的,它们不会产生垃圾回收的压力,并且可以安全地用于job和Burst编译的代码中。

collection类型分为几类:

以Native开头的类型会执行安全检查,并在以下情况中抛出错误: — collection没有被正确地释放。 — collection和job一起使用时不具备线程安全性。

以Unsafe开头的类型不执行安全检查

其余类型都是没有指针的小结构类型,因此根本不需要分配。因此,它们不需要释放,也没有线程安全问题。

几个Native类型有对应的Unsafe版本。例如,有NativeList和UnsafeList,也有NativeHashMap和UnsafeHashMap等。出于安全考虑,建议尽量使用Native集合而不是Unsafe版本

Mathematics

Mathematics包是一个专为Burst和作业系统设计C#数学库,类似于Collections,能够将C#/IL代码编译成高效的本地代码。它提供了:

— 向量和矩阵类型,如float3、quaternion、float3x3。

— 遵循类似HLSL着色器约定的许多数学方法和运算符。

— 许多方法和运算符的专用Burst编译器优化hooks。

有关更多信息,请查看Unity.Mathematics备忘单。

需要注意的是,旧版UnityEngine.Mathf库的大多数类型和方法可以在Burst编译的代码中使用,但Unity.Mathematics的等效方法在某些情况下会有更好的性能。


http://www.kler.cn/a/507537.html

相关文章:

  • 【 MySQL 学习2】常用命令
  • 【redis】redis-cli命令行工具的使用
  • 卷积神经05-GAN对抗神经网络
  • 大疆最新款无人机发布,可照亮百米之外目标
  • 【Flink系列】9. Flink容错机制
  • Android BottomNavigationView不加icon使text垂直居中,完美解决。
  • 【FlutterDart】MVVM(Model-View-ViewModel)架构模式例子-http版本(30 /100)
  • 阿里云通义实验室自然语言处理方向负责人黄非:通义灵码2.0,迈入 Agentic AI
  • matlab函数的主要目的是对包含在 Excel 电子表格中的实验数据进行模型拟合
  • 【k8s面试题2025】3、练气中期
  • 《机器学习》——SVD(奇异分解)降维
  • Go语言的编程范式
  • SpringBoot:RestTemplate与IllegalArgumentException
  • Springboot项目Jackson支持多种接收多种时间格式
  • C语言:-三子棋游戏代码:分支-循环-数组-函数集合
  • 如何利用CodeMeter保护您的物联网设备
  • XXL-JOB 加入 GitCode:推动分布式任务调度进阶发展
  • 【CLIP-LIT】Iterative Prompt Learning for Unsupervised Backlit Image Enhancement
  • 今日总结 2025-01-17
  • 【HBuilderX 中 Git 的使用】
  • C++通透讲解设计模式:依赖倒转(1)
  • 【MySQL】:事务
  • 什么是 OpenSSL?OpenSSL 如何工作?
  • hive连接mysql报错:Unknown version specified for initialization: 3.1.0
  • OpenCV入门学习
  • 讲一下ZooKeeper的持久化机制?