Entitas CookBook 翻譯 - 102_Entity 實體

實體 Entity

一個Entity只是一個裝滿Component的容器。我們可以將Component添加到Entity中、從Entity中獲取Component、也可以將一個Component從Entity上刪除。在Entitas-CSharp中,有一種內(nèi)部/通用的方式來執(zhí)行這些操作:

entity.AddComponent(index, component);
entity.GetComponent(index);
entity.RemoveComponent(index);

我們必須使用索引,因為這個容器是以IComponent數(shù)組的形式實現(xiàn)的。在Entitas-CSharp中,我們選擇使用數(shù)組是出于性能原因。然而,有些實現(xiàn)選擇使用哈希表(HashMap),使Component類型成為Key,Component實例成為Value。

在你抱怨API太麻煩之前,讓我向你展示如何在實際發(fā)開中添加、獲取和刪除Entitas-CSharp中的Component。

先假設(shè)我們有個Component PositionComponent。

public sealed class PositionComponent : IComponent {
    public IntVector2 value;
}

那么實際上的API是這樣的:

entity.AddPosition(new IntVector2(x, y));
entity.position;
entity.RemovePosition();

由于我們?yōu)镋ntitas-CSharp實現(xiàn)了一套代碼生成工具(Code Generator),我們最終能直接使用這個漂亮的API。你可以在“器具(Appliances)”關(guān)于“代碼生成(Code Generation)”一章中找到有關(guān)此主題的更多信息。

Entity的創(chuàng)建

Entity應(yīng)始終是Context的一部分。這就是為什么我們不能直接實例化Entity,而必須調(diào)用context.CreateEntity()。Context是一個管理型的數(shù)據(jù)結(jié)構(gòu),用于監(jiān)控Entity的生命周期,你可以在Context章節(jié)中找到關(guān)于Context的更多細節(jié)。

非常重要的一點,雖然可以創(chuàng)建和銷毀Entity,Entitas-CSharp中銷毀的Entity并未真正銷毀,而是在Context中被緩存了起來(pooled in the context)。這是一個避免GC的性能優(yōu)化。這個優(yōu)化的副作用是:如果用戶在自己的代碼中保留對Entity的引用,那么這個引用的使用必須額外小心。

當(dāng)一個Entity被銷毀時,它將被放入一個臨時池中,并在引用數(shù)量是'0'的時候被重用。

什么是引用數(shù)量?

引用數(shù)量是一種內(nèi)部機制,它確保Entity在不再被引用之前不會被重用。Entity有兩種方法處理引用:

public void Retain(object owner)

public void Release(object owner)

當(dāng)你想保持對一個Entity的引用時,你必須調(diào)用entity.Retain(this);當(dāng)你需要刪除引用時,調(diào)用entity.Release(this);,這是非常重要的!這些調(diào)用會增加和減少引用計數(shù)。 Entitas-CSharp的所有內(nèi)部類都遵守這種機制,所以你的代碼也應(yīng)該如此。如果您在保留對Entity的引用的同時不調(diào)用保留(Retain),則最終可能會引用一個已被銷毀并重新生成的Entity。如果您忘記在保留的Entity上調(diào)用釋放(Release),它將永遠停留在對象池中,從而使您的內(nèi)存消耗隨著時間的推移而增長。

Entity的觀察模式(entity observation)

一個Entity可以有多個用戶訂閱的事件,反映到Entity的生命周期上。
以下是Entitas-CSharp當(dāng)前中所有事件的實現(xiàn)列表:

  • OnComponentAdded
  • OnComponentRemoved
  • OnComponentReplaced
  • OnEntityReleased
  • OnDestroyEntity

這些事件是Context 用于監(jiān)視Entity 的相同事件。它們也暴露在外部使用,但我不建議直接使用它們。在典型的使用案例中,您更希望擁有一個Group,一個Collector 或一個Reactive System(這些都會在下面的章節(jié)中介紹)。

不管怎么樣,知道這些設(shè)施的存在是很好的事情,如果您正在實現(xiàn)一些自己的工具,那么使用這些內(nèi)置的設(shè)施可能就會變得很重要。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,286評論 8 265
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,699評論 19 139
  • 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經(jīng)到供過于求了。今年,找過工作人可能會更深刻地體會到今年的就...
    麥兜兜買兜兜閱讀 723評論 1 4
  • 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經(jīng)到供過于求了。今年,找過工作人可能會更深刻地體會到今年的就...
    iOS_Alex閱讀 1,657評論 1 24
  • ——再見戈多 神話的意義就在于,它浪漫地向我們展開這樣一個令人難以反駁的事實:那便是在沒有先行意識的情況下,我們被...
    kk橫道世之介閱讀 2,585評論 0 0

友情鏈接更多精彩內(nèi)容