N3架構上是分了三層的, foundation, render, application.
一直以來看的都是foundation和render, 上層的一直沒怎麼看
今天大體上瀏覽了下, 感覺東西還是滿多的
很多引擎都沒這一層的, 如果沒有實際項目的積累, 也沒法抽象出複用的部分來
這裡說的Entity不是GraphicsEntity, 而是Game::Entity, 代表遊戲中的一個對象, 比如人, 道具什麼的
一個Entity由以下幾部分組成:
- ID : 這個沒啥好說的
- AttributeTable: 屬性工作表, 跟資料庫綁定, 資料驅動的前提
- Properties: 或許叫Component更合適, 組件模型, 現在大家都這麼幹了, 除了國內的人-_-
跟其他組件模型有點不一樣的是, 如果想調用Entity中某個組件的功能, 直接發個訊息給這個Entity就可以. 它自己找到處理這個訊息的Property進行處理. 從這一點來說, Entity也是一個訊息分配器(Dispatcher):
+------+<br /> +-->| Port |<br /> / +------+<br /> +------------+/ +------+<br /> --- Msg --->| Dispatcher |----->| Port |<br /> +------------+/ +------+<br /> / +------+<br /> +-->| Port |<br /> +------+<br />
實際上Property是從Messaging::Port繼承的, 然後Port再把訊息交給Handler去處理. 這樣一來, 擴充功能只需要增加Message和對應的Handler就可以了.
想想N3中其實很多地方都用了訊息, 比如多線程. 雖然這種方式解決了同步之類的煩惱, 但是也造就了Message滿天飛的現象, 以至於他們寫了個idlc來自動產生Message標頭檔...
在看WPF執行緒模式的時候, 突然想到, 是不是可以參考它的跨線程調用方法(Dispatcher.BeginInvoke)呢? 其實就是把調用函數變成一個delegate, 再加上參數, 一起裝在一起排入佇列. 本質上還是訊息的形式, 只不過不用定義訊息結構和寫處理分支了. 壞處就是, 把調用細節暴露出來, 耦合度太大......
嗯, 跑題了
那個Property派生出來GraphicsProperty, TransformableProperty, CameraProperty, InputProperty, StateProperty等等. 想要顯示在情境裡就用GraphicsProperty, 想響應輸入就加一個InputProperty, 諸如此類. 要調用其它Property的方法也不用從Entity中找到再cast什麼的, 直接一個訊息扔進去就完了...
另外屬性工作表的應用和實現都比較複雜, 下回分解