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也不会报错,但是操作数据会产生不可预料的结果。
本文深入探讨了Unity的ECS框架中DynamicBuffer组件的工作原理,包括其如何支持可变大小的弹性buffer,自动内存管理和与EntityManager的交互。此外,还介绍了如何声明buffer元素类型,添加buffer到实体,以及访问和重新解释buffer的方法。
471

被折叠的 条评论
为什么被折叠?



