到目前為止,
EnTT一直是一個夢想,我們迄今為止還沒有找到一個錯誤,並且非常容易使用- 曾經的每個ENTT用戶
EnTT是一個僅限標題,微小且易於使用的庫,用於遊戲編程,並且用現代C ++編寫得更多。
除其他外,它是在Mojang的Minecraft中使用的,Esri的Arcgis Runtime SDK和Amazing Ragdoll使用了它。
如果您沒有在列表中看到您的項目,請打開問題,提交PR或將#entt標籤添加到您的主題中! ?
您想跟上更改嗎?還是有一個不需要您打開問題的問題?
加入Gitter頻道和Discord Server,與您這樣的其他用戶會面。我們越多,對每個人來說越好。
不要忘記檢查常見問題解答和Wiki。您的答案可能已經存在。
您想支持EnTT嗎?考慮成為贊助商或通過PayPal捐款。
非常感謝這些人,並特別感謝:


實體 - 組件系統(也稱為ECS )是主要用於遊戲開發的建築模式。有關更多詳細信息:
該項目最初是純實體組件系統。隨著時間的流逝,隨著越來越多的類和功能的添加,代碼庫不斷增長。
這是今天提供的簡短但不完整的清單:
constexpr實用程序。將此列表視為正在進行的工作以及項目。對於那些勇於閱讀它的人來說,整個API已充分記錄在編碼中。
請注意,所有工具現在也對DLL友好,並且在邊界之間順利運行。
大多數人已知的一件事是Minecraft也使用了EnTT 。
鑑於該遊戲幾乎無處不在,因此我可以自信地說,在可以銘記的每個平台上對圖書館進行了充分的測試。
# include < entt/entt.hpp >
struct position {
float x;
float y;
};
struct velocity {
float dx;
float dy;
};
void update (entt::registry ®istry) {
auto view = registry. view < const position, velocity>();
// use a callback
view. each ([]( const auto &pos, auto &vel) { /* ... */ });
// use an extended callback
view. each ([]( const auto entity, const auto &pos, auto &vel) { /* ... */ });
// use a range-for
for ( auto [entity, pos, vel]: view. each ()) {
// ...
}
// use forward iterators and get only the components of interest
for ( auto entity: view) {
auto &vel = view. get <velocity>(entity);
// ...
}
}
int main () {
entt::registry registry;
for ( auto i = 0u ; i < 10u ; ++i) {
const auto entity = registry. create ();
registry. emplace <position>(entity, i * 1 . f , i * 1 . f );
if (i % 2 == 0 ) { registry. emplace <velocity>(entity, i * . 1f , i * . 1f ); }
}
update (registry);
}出於錯誤的原因,我開始開發EnTT :我的目標是設計一個實體組件系統,以在性能和可能的內存使用方面擊敗另一個知名的開源庫。
最後,我做到了,但這並不令人滿意。實際上,它根本不滿意。最快,僅此而已,確實很少。當我意識到這一點時,我努力保持完整的EnTT表現,並同時添加我想在自己的庫中看到的所有功能。
如今, EnTT終於是我想要的:仍然比競爭對手快,在平均情況下使用較低的內存使用情況,非常好的API和一系列驚人的功能。當然還有更多。
就其價值而言,您永遠不會看到我試圖使其他項目看起來不好,或者提供可疑的比較只是為了使該庫看起來更酷。
如果他們喜歡它,我將這項活動留給其他人(似乎有些人實際上喜歡它)。我更喜歡更好地利用自己的時間。
如果您有興趣,可以通過將ENTT_BUILD_BENCHMARK CMake設置為ON ,可以在發行模式下編譯benchmark測試(啟用編譯器優化,否則就沒有意義),然後評估您對結果是否滿意。
還有很多項目使用EnTT作為比較的基礎(這應該已經告訴您很多)。這些基準中的許多是完全錯誤的,許多其他基準只是不完整的,善於省略一些信息並使用錯誤的功能比較給定功能。當然,也有不錯的,但是如果沒有人更新它們,它們會很快,尤其是當與之打交道的圖書館會積極開發時。
在所有這些中,這似乎是最新的項目,還涵蓋了一定數量的庫。我不能確切說EnTT是否正確使用。但是,即使使用量較差,它仍然應該使讀者了解其要在哪裡運作的想法。
EnTT是僅限標題庫。這意味著,包括entt.hpp標頭(包括entt.hpp標頭)足以包括整個庫並使用它。對於僅對實體組件系統感興趣的人,請考慮包括唯一的entity/registry.hpp標頭。
這是將以下行添加到文件頂部的問題:
# include < entt/entt.hpp >使用下面的行僅包括實體組件系統:
# include < entt/entity/registry.hpp >然後將適當的-I參數傳遞給編譯器,以將src目錄添加到Incluber路徑。
為了能夠使用EnTT ,用戶必須提供一個功能齊全的編譯器,該編譯器至少支持C ++ 17。
以下要求必須編譯測試並提取文檔:
CMake版本3.7或更高版本。Doxygen版本1.8或更高版本。另外,巴澤爾也被支持作為建築系統(Zaucy願意維護它的Zaucy)。
在下面的文檔中,我仍會參考CMake ,這是圖書館的官方構建系統。
要使用CMake項目中的EnTT ,只需將現有目標鏈接到EnTT::EnTT別名即可。
該庫提供了您所需的所有定位(如find_package ),嵌入(如add_subdirectory中),獲取(如FetchContent )或以許多您可以想到的方式以及涉及CMake方式。
涵蓋所有可能的案例將需要論文而不是簡單的回复文件文件,但是我有信心閱讀本節的任何人也知道它的含義,並且可以在毫無問題的情況下使用CMake項目中的EnTT 。
使用CMake時,只需啟用選項ENTT_INCLUDE_NATVIS並享受它。
否則,大多數工具都通過NATVI覆蓋,所有文件都可以在natvis目錄中找到,除以模塊。
如果您發現錯誤或有建議,歡迎任何貢獻!
EnTT可用於一些最著名的包裝工具。尤其:
Conan ,開發人員的C/C ++軟件包管理器。
vcpkg ,Microsoft VC ++包裝工具。
您只需幾個簡單的步驟即可下載和安裝EnTT :
$ git clone https://github.com/Microsoft/vcpkg.git
$ cd vcpkg
$ ./bootstrap-vcpkg.sh
$ ./vcpkg integrate install
$ vcpkg install entt
或者,您可以使用experimental功能來測試最新更改:
vcpkg install entt[experimental] --head
vcpkg中的EnTT端口由Microsoft團隊成員和社區貢獻者保持最新狀態。
如果該版本已過時,請在vcpkg存儲庫上創建問題或拉出請求。
Homebrew ,MacOS缺少的軟件包經理。
可作為自製配方。只需鍵入以下內容即可安裝它:
brew install skypjack/entt/entt
build2 ,構建用於開發和包裝C和C ++代碼的工具鏈。
為了在build2項目中使用entt軟件包,在manifest文件中添加以下行或類似行:
depends: entt ^3.0.0
還要檢查配置是否是指有效的存儲庫,以便可以通過build2 :build2:
開源社區中央存儲庫cppget.org ,可作為https://pkg.cppget.org/1/stable訪問。
包源存儲庫:可作為https://github.com/build2-packaging/entt.git或ssh://[email protected]/build2-packaging/entt.git訪問。隨時報告此軟件包的問題。
兩者都可以與bpkg add-repo一起使用,也可以在project repositories.manifest中添加。有關更多詳細信息,請參見官方文檔。
bzlmod ,Bazel的外部依賴管理系統。
要在bazel項目中使用entt模塊,請將以下內容添加到您的MODULE.bazel文件:
bazel_dep ( name = "entt" , version = "3.12.2" )現在將以@entt ( @entt//:entt的簡短)提供ENTT,可在您的cc_*規則deps中使用。
將此列表視為正在進行的工作,並在您願意的情況下幫助我更長的時間。
EnTT還支持pkg-config (至少為支持的某些定義)。運行CMake時,生成並安裝在適當目錄中entt.pc合適文件。
這也應該使與Meson或類似工具的工具更容易使用。
該文檔基於doxygen。建造它:
$ cd build
$ cmake .. -DENTT_BUILD_DOCS=ON
$ make
API參考是在build/docs/html目錄中以HTML格式創建的。使用您喜歡的瀏覽器來瀏覽它:
$ cd build
$ your_favorite_browser docs/html/index.html
同一版本也可以在線提供最新版本,這是最後一個穩定的標籤。
此外,還有一個致力於該項目的Wiki,用戶可以在其中找到所有相關的文檔頁面。
要編譯和運行測試, EnTT需要Googletest 。
在編譯其他任何內容之前, cmake下載並編譯庫。為了構建測試,請將CMake選項設置ON ENTT_BUILD_TESTING 。
構建最基本的測試集:
$ cd build$ cmake -DENTT_BUILD_TESTING=ON ..$ make$ make test請注意,基準不是該集合的一部分。
EnTT廣泛用於私人和商業應用中。我什至無法提及其中的大多數,因為我之前在某些文檔上貼上了一些簽名。幸運的是,也有一些人花時間基於EnTT實施開源項目,並且在記錄記錄時沒有退縮。
在這裡,您可以找到可以用作參考的遊戲,應用程序和文章的不完整列表。
如果您知道有關EnTT的其他資源,請隨時打開問題或PR,我很高興將它們添加到列表中。
高度讚賞對功能,PR,建議和反饋的要求。
如果您發現自己可以通過您的經驗為項目提供幫助,並且想為項目做出貢獻,或者出於某些其他原因確實想獲得該項目的一部分,請隨時與我聯繫(您可以在個人資料中找到郵件)。
我不能保證每項貢獻都將被接受,但是我可以保證我會盡力盡快將它們全部帶走。
如果您決定參加,請查看有關在創建問題或提取請求之前做出貢獻的準則。
還要查看貢獻者列表,以了解到目前為止誰參加了會議。
代碼和文檔版權(C)2017-2024 Michele Caini。
彩色徽標版權(C)2018-2021理查德·卡斯雷斯(Richard Caseres)。
根據MIT許可發布的代碼。
根據CC發布的文檔4.0。
根據CC BY-SA 4.0發布的所有徽標。