Entitas CookBook 翻譯 - 103_Context 上下文

上下文 Context

Context是一種為Entity服務的的管理性數(shù)據(jù)結構囤热。一個Entity不能自己獨立創(chuàng)建,它必須通過context.CreateEntity()創(chuàng)建岖妄。通過這種方式,Context可以管理我們創(chuàng)建的所有Entity的生命周期币叹。它也是第一個在我們操作Entity時得到通知的觀察者(請參閱Entity章節(jié)中的Entity觀察(Entity observation )部分)绣檬。

Entity對象池

為了避免GC璧眠,Entitas-CSharp中的Context具有內部對象池機制缩焦。當用戶創(chuàng)建一個新的Entity時,對象池將使用先前被銷毀而存儲起來的Entity责静。這種方式堆上的內存得到回收袁滥。一個Entity只有在我們確信沒有任何地方引用到的時候才會被回收。這就是Entitas-CSharp具有內部引用計數(shù)(internal reference count)機制的原因灾螃。如果您僅使用Entitas來記錄题翻,并且不存在任何自己存儲的引用,則不必考慮它腰鬼。內部類已經(jīng)為您處理了所有引用的計數(shù)嵌赠。但是,如果你想創(chuàng)建一個Component熄赡,如:

class Neighbour: IComponent {
    public IEntity reference;
}

或者擁有一個MonoBehaviour儲存了Entity的引用:

class EntityLink : MonoBehaviour {
    IEntity _entity;
}

如果這樣的話姜挺,你需要調用_entity.Retain(this);來儲存一個引用。當你不再需要這個Entity彼硫、或者Entity被銷毀的時候炊豪,你要記得調用_entity.Release(this);凌箕。如果你忘記調用Release,一個被銷毀的Entity將被永久保留在內存中并且不會被重用词渤。非常容易導致內存泄漏牵舱,這在Entitas Visual Debugger中很容易觀察得到。如果你忘記調用Retain缺虐,你可能會得到一個Entity的轉世版本(reincarnated version)芜壁。這將導致非常難以調試,并且非常奇怪的行為高氮。

順便說一句沿盅,我們不鼓勵那些Component里面引用另一個Entity,更偏向的是使用Entity Index 的Component(參見索引(Index)章節(jié))纫溃。而EntityLink現(xiàn)在是Entitas.Unity插件的一部分腰涧,所以如果你只需要引用GameObject上的Entity,不必擔心紊浩,有我們呢窖铡。

多個Context類型

如果我們將一個典型的關系數(shù)據(jù)庫(基于表結構的)與Entitas進行比較,我們可以得出以下聯(lián)系坊谁。一個Component是一個列(column)费彼,一個Entity是一個行(row),Context(context)是一個表(table)本身】谏郑現(xiàn)在在關系數(shù)據(jù)庫中箍铲,一個表是根據(jù)結構(scheme)來定的。在Entitas中鬓椭,它基于實現(xiàn)IComponent的類颠猴。這意味著當我們定義更多的Component類時,我們表的表頭就變得更廣泛小染。對于不同的實現(xiàn)細節(jié)翘瓮,對內存消耗會有不同的影響。對Entitas-CSharp來說裤翩,它對內存消耗的確有一定的影響资盅,因為一個Entity就是一個IComponent的數(shù)組。

為了解決日益增長的表格大小問題踊赠,我們可以引入另一個表格呵扛。
這里是Entitas-Csharp Wiki的一個片段:

using Entitas;
using Entitas.CodeGenerator;

[Game, UI]
public class SceneComponent : IComponent
{
    public Scene Value;
}

[Game]
public class Bullet
{
    // Since it doesn't derive from 'IComponent'
    // it will be generated as 'BulletComponent'
}

[Meta]
public struct EditorOnlyVisual
{
    public bool ShowInMode;

    public EditorOnlyVisual(bool show) {
        this.ShowInMode = show;
    }
}

Component類聲明之上的屬性告訴代碼生成器我們想要擁有哪些Context類型。在這個特定的例子中筐带,我們有一個Game今穿,MetaUIContext。正如你看到的SceneComponent一樣烫堤,一個Component可以是多個Context的一部分荣赶。這樣做的意義是凤价,如果我們想要用關系型數(shù)據(jù)庫(realtional database)的模型來解釋的話,則表Game和表UI都應該要可以有Scene列拔创。

我應該建立多少種Context類型呢利诺?

這真的取決于你的應用場景。如果你有一個相當小/簡單的游戲剩燥,你可以只使用一個Context慢逾,這種方式更簡單。您需要記住的是一個Entity是由一個Icomponent數(shù)組構成的灭红,它是一個指針數(shù)組侣滩。指針在64bit的系統(tǒng)結構的大小為8個bytes。所以如果你有50個Component变擒,每個Component的大小至少為400bytes君珠。如果您的游戲中有100個Entity,則它們占用40KB娇斑。40KB是否很多的消耗全由你自己判斷策添,如果您有數(shù)百個Component和數(shù)千個Entity,最好開始分片管理毫缆。

有時即使是為了更好的組織唯竹,將Component分成不同的Context也是非常有好處的。您可能有些只用在游戲核心邏輯中的Component苦丁,或者只是與元游戲(meta game指monobehavior一類)相關的Component浸颓。如果確定Component間沒有重疊,不存在既需要存儲ComponentA和又要存儲ComponentZ的Entity旺拉。那么最好將他們放在不同的表(tables)中产上。

Context的觀察(Context Observation)

與Entity相同,Context的改變也是可以觀察的账阻。這也是我們在內部功能組(Group 本章將會介紹)和可視化調試器(visual debugger)中使用的事件蒂秘。
如果您想為Entitas編寫一些工具泽本,例如自定義記錄(Logging)或分析(Profilling)淘太、您可以使用以下事件:

  • OnEntityCreated
  • OnEntityWillBeDestroyed
  • OnEntityDestroyed
  • OnGroupCreated
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市规丽,隨后出現(xiàn)的幾起案子蒲牧,更是在濱河造成了極大的恐慌,老刑警劉巖赌莺,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冰抢,死亡現(xiàn)場離奇詭異,居然都是意外死亡艘狭,警方通過查閱死者的電腦和手機挎扰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門翠订,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遵倦,你說我怎么就攤上這事尽超。” “怎么了梧躺?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵似谁,是天一觀的道長。 經(jīng)常有香客問我掠哥,道長巩踏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任续搀,我火速辦了婚禮塞琼,結果婚禮上,老公的妹妹穿的比我還像新娘禁舷。我一直安慰自己屈梁,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布在讶。 她就那樣靜靜地躺著,像睡著了一般构哺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上战坤,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音途茫,去河邊找鬼。 笑死囊卜,一個胖子當著我的面吹牛娜扇,可吹牛的內容都是我干的栅组。 我是一名探鬼主播雀瓢,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼玉掸!你這毒婦竟也來了刃麸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤司浪,失蹤者是張志新(化名)和其女友劉穎泊业,沒想到半個月后把沼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡吁伺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年智政,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箱蝠。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡续捂,死狀恐怖,靈堂內的尸體忽然破棺而出宦搬,到底是詐尸還是另有隱情牙瓢,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布间校,位于F島的核電站矾克,受9級特大地震影響,放射性物質發(fā)生泄漏憔足。R本人自食惡果不足惜胁附,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滓彰。 院中可真熱鬧控妻,春花似錦、人聲如沸揭绑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽他匪。三九已至菇存,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邦蜜,已是汗流浹背依鸥。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悼沈,地道東北人贱迟。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像井辆,于是被迫代替她去往敵國和親关筒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理杯缺,服務發(fā)現(xiàn),斷路器睡榆,智...
    卡卡羅2017閱讀 134,669評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,823評論 6 342
  • 實體 Entity 一個Entity只是一個裝滿Component的容器萍肆。我們可以將Component添加到Ent...
    SkyrimWu閱讀 1,401評論 0 1
  • 從三月份找實習到現(xiàn)在袍榆,面了一些公司,掛了不少塘揣,但最終還是拿到小米包雀、百度、阿里亲铡、京東、新浪奖蔓、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,255評論 11 349
  • 微博上曾經(jīng)流傳過一句話;“百年修得王小賤, 千年修得李大仁, 萬年修得黃小廚知允∪鲶埃”黃小廚就是黃磊,他無疑是娛樂圈的好...
    醉后揮毫筆有神閱讀 686評論 0 0