为什么在 Unity 中使用 DOTS 编程比使用 GameObject 更快?

以下是 bản dịch tiếng Trung của đoạn bạn cung cấp:


DOTS 是 Data-Oriented Technology Stack(数据导向技术栈)的缩写,包含 Unity 中一组用于以数据驱动方式开发游戏的库。

1. DOTS 优化了内存访问与 CPU 缓存命中率

首先,我们先简单了解一下 CPU 缓存。当 CPU 执行一条读取数据的指令时,数据可能位于:

  • L1 缓存:速度非常快,但容量极小

  • L2/L3 缓存:速度较快,容量稍大

  • RAM:容量非常大,但速度比缓存慢几十倍

如果 CPU 在缓存中找到了数据(称为 "缓存命中"),速度会非常快。相反,如果 CPU 需要从 RAM 读取数据(称为 "缓存未命中"),就会非常慢,可能需要数百个 CPU 时钟周期。

在使用 GameObject 的方式中,每个组件(例如 Transform、RigidBody、CustomComponent)都是一个独立的 C# 对象,内存在内存中是随机分布的。比如在遍历 1000 个 GameObject 时,CPU 需要不断跳转到内存中各个不连续的位置,这会导致频繁的缓存未命中,从而降低访问速度。

而使用 DOTS 时,Entity Component System(ECS)可以将多个实体中相同类型的组件连续存储。例如,有 128 个怪物,每个怪物有 Position 和 Velocity,那么它们的内存布局如下:

  • Position[0..127](连续存储)

  • Velocity[0..127](连续存储)

通过这种布局,CPU 可以顺序访问数组中的每个元素,从而更好地预测并提前加载即将访问的数据到缓存中(称为 Cache Prefetching),显著提高遍历效率。

2. DOTS 充分利用多核 CPU

GameObject 模式主要运行在主线程上,而 DOTS 使用 C# Job System 可将任务并行分配到多个 CPU 核心上执行。这样可以更有效地利用当前普遍采用多核设计的 CPU 性能。

3. DOTS 支持手动内存管理

在 C# 中,垃圾回收(GC)机制可能会在清理大量不再使用的对象时造成游戏暂停数毫秒。虽然数毫秒听起来不长,但在游戏中玩家仍能明显感觉到卡顿,影响体验。

DOTS 提供了 Native Collection 这类不受 GC 管理的数据结构,开发者必须手动管理内存并在使用结束后释放资源,虽然这增加了开发的复杂度,但能避免由 GC 带来的不可预期的性能抖动。

4. DOTS 使用了全新的 Burst 编译器

Burst 是 Unity 推出的新一代编译器,可以将 C# 代码编译为高效的机器码。它专注于性能优化,相比 Unity 之前使用的 Mono 或 IL2CPP 编译方式,执行效率大幅提升。

5. 总结

虽然使用 DOTS 编程相比传统 GameObject 模式更复杂、更难上手,但由于其卓越的性能优势,对于拥有大量对象、对性能要求极高的游戏项目(尤其是 MMO 游戏)来说,DOTS 是一个值得考虑的选择。Unity 也推出了专门支持 DOTS 网络开发的 Netcode for Entities 框架,进一步完善了其生态系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值