天天看點

Unity Entity Component System --- Dynamic Buffer Components

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():

利用原型:

Accessing Buffers

有多種方法可以通路buffers,

直接在主線程通路:

基于Entity通路

可以在JobComponentSystem中基于每個entity進行通路

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

Reinterpreting Buffers (Experimental)

Buffer類型強制轉換(實驗特性)

Buffer可以被強制轉換成長度相同的類型的Buffer:

将MyBufferElement類型的Buffer,轉換成int類型。因為它們的長度一緻。

需要注意的是,因為沒有類型檢查,是以轉成float也不會報錯,但是操作資料會産生不可預料的結果。

繼續閱讀