DOTS和ECS的概念

ECS(Entity Component System)介绍(前导)

  • ECS本质是一种编程架构模式,非unity特有。Unity通过Entities包实现ECS架构来组织代码和数据
  • Entity是一个独立的ID,是多个独立components的组合。有点类似于拼积木,components就是小积木,不同小积木拼成了A、B、C三种模型,A、B、C就是三个不同entities,见下图。其中模型A和B的形状相同但是颜色不同(用的小积木的形状相同但颜色不同,对应ECS就是拥有相同的components,但是components中的值不一样)。A和B形状相同叫积木小甲,C叫积木小乙,小甲就是entityA和entityB所在archetype,小乙就是entityC所在的archetype。假设某一天,需要在A身上加一个组件形成一个新的积木,这个新的积木形状就叫小D,之前的A就不存在了,会被移入到小D对应的archetype中。这个变化过程叫做structural change,是一个非常耗时的操作
  • Component保存数据,不同的数据结构的定义了不同的components。可以通过System来读取和修改components中的数据。在积木拼搭例子中,不同component的定义就是不同形状的小积木,而同一个component定义但是实例的值不同,可以理解为形状相同但是颜色不同的components
  • System提供修改components数据的逻辑,也可以用来生成和创建Entity。在积木拼搭的例子中,其就像拼搭积极的流水线。其中拼搭小甲的是一条流水线,拼搭小乙的是一条流水线,分别对应了不同的两个systems。同一条流水线,又可以修改某个component积木的颜色,来生产出形状相同而颜色不同的积木,也就是不同的Entity。这里只是举例方便理解,实际代码中,system和entity并不是一一对应的
  • 下图是Unity官方文档对entities、component、systems如何一起工作的示例:在这里插入图片描述

DOTS(数据导向技术栈)介绍

  • DOTS本质是Unity提出的一套性能优化技术集合‌,包含多个子系统:
    • ECS架构‌(核心部分)
    • Burst编译器‌:将C#代码编译为高度优化的原生代码
    • Job System‌:安全的多线程任务管理系统
    • Mathematics库‌:SIMD优化的数学库
    • Hybrid Renderer‌:ECS与渲染管线的桥梁
  • 设计目标‌:解决传统面向对象模式在性能密集型场景(如大规模实体、AI、物理等)的性能瓶颈

关系与层级

  • 包含关系‌:
    ECS是DOTS的核心架构‌,但不是DOTS的全部。DOTS是一个更广泛的技术栈,ECS是实现其高性能目标的核心编程范式
  • 协同工作‌:
    ECS负责数据组织,Job System和Burst编译器负责多线程与代码优化,Mathematics库提供数学运算支持,共同构成DOTS的性能优化生态

关键区别

在这里插入图片描述

性能对比(传统OOP vs ECS/DOTS)

在这里插入图片描述

何时使用?

  • 推荐ECS/DOTS的场景‌:
    • 大规模实体(如RTS游戏单位、粒子系统)
    • 需要复杂物理模拟(如流体、布料)
    • 高性能计算需求(如体素地形生成)
  • 传统模式更合适的场景‌:
    • 小型项目或原型开发
    • 需要快速迭代的UI逻辑
    • 依赖大量第三方插件(如复杂动画状态机)

代码示例对比

传统MonoBehaviour方式

public class Enemy : MonoBehaviour 
{
    public float speed = 5f;
    void Update() 
    {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }
}

#ECS + DOTS方式

// Component(纯数据)
public struct MoveSpeed : IComponentData {
    public float Value;
}

// System(逻辑处理)
public partial struct MovementSystem : ISystem 
{
    public void OnUpdate(ref SystemState state) 
    {
        float deltaTime = SystemAPI.Time.DeltaTime;
        foreach (var (transform, speed) in  SystemAPI.Query<RefRW<LocalTransform>, RefRO<MoveSpeed>>()) {
            transform.ValueRW.Position += transform.ValueRO.Forward() * speed.ValueRO.Value * deltaTime;
        }
    }
}

总结

  • ECS是架构‌,DOTS是包含ECS的技术生态
  • ECS+DOTS组合通过数据连续性、多线程和编译优化,突破传统OOP的性能限制,尤其适合高性能需求场景
  • Unity通过Hybrid模式允许ECS与传统GameObject共存,实现渐进式迁移

参考

  • Unity官方文章
  • DeepSeek
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值