前進!前進!不擇手段的前進!
Entity(實體) Component(組件) System(系統)
是一種基於數據的設計(DOD Data-Oriented Design)htmldodbook
ECS的泛泛之談
深刻淺出Unity ECS
ECS 真的是「將來主流」的架構嗎?
面向對象編程的弊端是什麼?
面向數據編程git
for (s in systems) { s.doSomething(data); // data爲對應系統須要使用的數據 }
Q:什麼是邏輯幀?
A:任何一個持續運行的程序,內部都有一個死循環。每執行一次循環,稱爲一個邏輯幀github
OOD(Object-Oriented Design)編程
COD(Compoment-Oriented Design) 緩存
DOD(Data-Oriented Design)服務器
實際上基於組件與基於接口本質相同,都是爲了解決傳統基於對象致使基類太重的問題。
基於組件、基於接口也獲得了普遍的應用。多線程
基於對象設計:基於現實的抽象。對象持有本身的全部數據、行爲。架構
基於數據設計:行爲是行爲,數據是數據。行爲只處理數據。行爲自己不屬於某個具體的對象。 函數
先看下傳統寫法爲何低效性能
for (p in players) { if (condition) { p.doSth(); } }
CPU讀取內存比較慢,因此設計了一套緩存
一次讀取一個cache line長度的數據
緩存三要素
廣度:
深度:
緩存技術遇到的問題
處理器猜想進入哪一個分支,而且基於預測結果來取指、譯碼。
若是猜想正確,就能節省時間。
若是猜想錯誤,刷新流水線,在新的地址處取指、譯碼。
廣度:
深度
對每個虛函數的調用都須要額外的指針尋址
虛函數一般不能被inline,當虛函數都是小函數時會有比較大的性能損失
每一個對象都須要有一個額外的指針指向虛表
緩存友好
須要三個基本池
分支預測
虛函數調用開銷