Unity Entity Component System --- Dynamic Buffer Components

本文深入探讨了Unity的ECS框架中DynamicBuffer组件的工作原理,包括其如何支持可变大小的弹性buffer,自动内存管理和与EntityManager的交互。此外,还介绍了如何声明buffer元素类型,添加buffer到实体,以及访问和重新解释buffer的方法。

Dynamic Buffers

DynamicBuffer是一种支持可变大小的弹性buffer component data,可以存放一定数量的元素数据。如果空间不足会分配堆内存块来扩充。

该方法的内存管理是自动的。DynamicBuffer的内存是由EntityManager管理的,所以当DynamicBuffer component删除时,其内存也会被释放。

Fixed Array 固定长度数组已经被Dynamicbuffer替代并移除。

Declaring Buffer Element Types

声明元素类型

需要用指定的类型来声明buffer:

// This describes the number of buffer elements that should be reserved
// in chunk data for each instance of a buffer. In this case, 8 integers
// will be reserved (32 bytes) along with the size of the buffer header
// (currently 16 bytes on 64-bit targets)

[InternalBufferCapacity(8)]
public struct MyBufferElement : IBufferElementData
{
    // These implicit conversions are optional, but can help reduce typing.
    public static implicit operator int(MyBufferElement e) { return e.Value; }

    public static implicit operator MyBufferElement(int e) { return new MyBufferElement { Value = e }; }

    // Actual value each buffer element will store.
    public int Value;
}

以上看起来是定义了一个元素类型,而不是一个buffer,这种设计由2个好处:

通过派生IBufferElementData,我们可以支持更多类型的buffer。而且这些类型可以有更多的数据成员。
我们可以将buffer定义到EntityArchetype原型中,就像一个comopent。

Adding Buffer Types To Entities
添加buffer

调用方法AddBuffer():

entityManager.AddBuffer<MyBufferElement>(entity);

利用原型:

Entity e = entityManager.CreateEntity(typeof(MyBufferElement));

Accessing Buffers

有多种方法可以访问buffers,

直接在主线程访问:

DynamicBuffer<MyElementBuffer> buffer = entityManager.GetBuffer<MyElementBuffer>(entity);

基于Entity访问

可以在JobComponentSystem中基于每个entity进行访问

var lookup = GetBufferFromEntity<MyBufferElement>();
var buffer = lookup[myEntity];
buffer.Append(7);
buffer.RemoveAt(0);

Reinterpreting Buffers (Experimental)

Buffer类型强制转换(实验特性)

Buffer可以被强制转换成长度相同的类型的Buffer:

var intBuffer = entityManager.GetBuffer<MyBufferElement>().Reinterpret<int>();

将MyBufferElement类型的Buffer,转换成int类型。因为它们的长度一致。

需要注意的是,因为没有类型检查,所以转成float也不会报错,但是操作数据会产生不可预料的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值