EnTTเคยเป็นความฝันมาจนถึงตอนนี้เรายังไม่พบข้อผิดพลาดเพียงครั้งเดียวและเป็นเรื่องง่ายมากที่จะทำงานด้วย- ผู้ใช้ ENTT ทุกคนเคย
EnTT เป็นห้องสมุดส่วนหัวอย่างเดียวเล็กและใช้งานง่ายสำหรับการเขียนโปรแกรมเกมและเขียนอีกมากมายใน C ++ ที่ทันสมัย
ในหมู่คนอื่น ๆ มันถูกใช้ใน Minecraft โดย Mojang, Arcgis Runtime SDKS โดย Esri และ The Amazing Ragdoll
หากคุณไม่เห็นโครงการของคุณในรายการโปรดเปิดปัญหาส่ง PR หรือเพิ่มแท็ก #ENTT ลงใน หัวข้อ ของคุณ! -
คุณต้องการ ติดตามการเปลี่ยนแปลง หรือคุณมี คำถาม ที่ไม่ต้องการให้คุณเปิดปัญหาหรือไม่?
เข้าร่วมช่อง Gitter และเซิร์ฟเวอร์ Discord พบกับผู้ใช้อื่น ๆ เช่นคุณ ยิ่งเรามากเท่าไหร่ก็ยิ่งดีสำหรับทุกคน
อย่าลืมตรวจสอบคำถามที่พบบ่อยและวิกิด้วย คำตอบของคุณอาจอยู่ที่นั่นแล้ว
คุณต้องการสนับสนุน EnTT หรือไม่? พิจารณาเป็น สปอนเซอร์ หรือบริจาคผ่าน PayPal
ขอบคุณมากสำหรับคนเหล่านี้และขอขอบคุณเป็น พิเศษ :


ระบบองค์ประกอบของเอนทิตี (หรือที่รู้จักกันในชื่อ ECS ) เป็นรูปแบบสถาปัตยกรรมที่ใช้เป็นส่วนใหญ่ในการพัฒนาเกม สำหรับรายละเอียดเพิ่มเติม:
โครงการนี้เริ่มต้นจากระบบองค์ประกอบเอนทิตีบริสุทธิ์ เมื่อเวลาผ่านไป codebase ได้เติบโตขึ้นเมื่อมีการเพิ่มคลาสและฟังก์ชันมากขึ้นเรื่อย ๆ
นี่คือรายการสั้น ๆ แต่ไม่สมบูรณ์ของสิ่งที่เสนอในวันนี้:
constexpr สำหรับ ชื่อทรัพยากร ที่มนุษย์อ่านได้ พิจารณารายการนี้งานที่กำลังดำเนินการเช่นเดียวกับโครงการ API ทั้งหมดได้รับการบันทึกไว้อย่างสมบูรณ์ในรหัสสำหรับผู้ที่กล้าพอที่จะอ่าน
โปรดทราบว่าเครื่องมือทั้งหมดเป็นมิตรกับ DLL ในขณะนี้และทำงานได้อย่างราบรื่นข้ามขอบเขต
สิ่งหนึ่งที่รู้จักกันมากที่สุดคือ EnTT ยังใช้ใน Minecraft
เนื่องจากเกมดังกล่าวมีอยู่อย่างแท้จริงทุกที่ฉันสามารถพูดได้อย่างมั่นใจว่าห้องสมุดได้รับการทดสอบอย่างเพียงพอในทุกแพลตฟอร์มที่สามารถนึกถึงได้
# 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 ที่ดีจริงๆและชุดคุณสมบัติที่น่าทึ่ง และยิ่งกว่านั้นแน่นอน
สำหรับสิ่งที่คุ้มค่าคุณจะ ไม่ เห็นฉันพยายามทำให้โครงการอื่นดูไม่ดีหรือเสนอการเปรียบเทียบที่น่าสงสัยเพียงเพื่อให้ห้องสมุดนี้ดูเย็นลง
ฉันปล่อยให้กิจกรรมนี้กับคนอื่น ๆ ถ้าพวกเขาสนุกกับมัน (และดูเหมือนว่าบางคนชอบมันจริง ๆ ) ฉันชอบที่จะใช้เวลาให้ดีขึ้น
หากคุณสนใจคุณสามารถรวบรวมการทดสอบ benchmark ในโหมด ON เปิดตัว (เพื่อเปิดใช้งานการเพิ่มประสิทธิภาพคอมไพเลอร์มิฉะนั้นมันจะสมเหตุสมผลเล็กน้อย) โดยการตั้งค่าตัวเลือก CMake ENTT_BUILD_BENCHMARK จากนั้นประเมินตัวเองว่าคุณพอใจกับผลลัพธ์หรือไม่
นอกจากนี้ยังมีโครงการจำนวนมากที่ใช้ EnTT เป็นพื้นฐานสำหรับการเปรียบเทียบ (ซึ่งควรบอกคุณมาก) เกณฑ์มาตรฐานเหล่านี้จำนวนมากผิดอย่างสมบูรณ์และอื่น ๆ อีกมากมายไม่สมบูรณ์ทำได้ดีในการละเว้นข้อมูลบางอย่างและใช้ฟังก์ชั่นที่ไม่ถูกต้องเพื่อเปรียบเทียบคุณสมบัติที่กำหนด แน่นอนว่ามีคนดี แต่พวกเขาอายุอย่างรวดเร็วหากไม่มีใครอัปเดตพวกเขาโดยเฉพาะอย่างยิ่งเมื่อห้องสมุดที่พวกเขากำลังติดต่อด้วยนั้นได้รับการพัฒนาอย่างแข็งขัน
จากทั้งหมดของพวกเขาดูเหมือนว่าโครงการที่ทันสมัยที่สุดและครอบคลุมห้องสมุดจำนวนหนึ่ง ฉันไม่สามารถพูดได้อย่างชัดเจนว่า EnTT ใช้อย่างถูกต้องหรือไม่ อย่างไรก็ตามแม้ว่าจะใช้ไม่ดี แต่ก็ควรให้ความคิดแก่ผู้อ่านว่าจะทำงานที่ไหน
EnTT เป็นห้องสมุดส่วนหัวเท่านั้น ซึ่งหมายความว่าการรวมส่วนหัวของ entt.hpp นั้นเพียงพอที่จะรวมไลบรารีโดยรวมและใช้งาน สำหรับผู้ที่สนใจเฉพาะในระบบองค์ประกอบเอนทิตีให้พิจารณาที่จะรวมส่วนหัวของ entity/registry.hpp แต่เพียงผู้เดียว HPP แทน
มันเป็นเรื่องของการเพิ่มบรรทัดต่อไปนี้ไปที่ด้านบนของไฟล์:
# include < entt/entt.hpp >ใช้บรรทัดด้านล่างเพื่อรวมเฉพาะระบบองค์ประกอบเอนทิตีแทน:
# include < entt/entity/registry.hpp > จากนั้นส่งอาร์กิวเมนต์ -I ที่เหมาะสมไปยังคอมไพเลอร์เพื่อเพิ่มไดเรกทอรี src ไปยังเส้นทางรวม
เพื่อให้สามารถใช้ EnTT ผู้ใช้จะต้องให้คอมไพเลอร์เต็มรูปแบบที่รองรับอย่างน้อย C ++ 17
ข้อกำหนดด้านล่างเป็นสิ่งจำเป็นในการรวบรวมการทดสอบและเพื่อแยกเอกสาร:
CMake เวอร์ชัน 3.7 หรือใหม่กว่าDoxygen เวอร์ชัน 1.8 หรือใหม่กว่า อีกทางเลือกหนึ่ง Bazel ยังได้รับการสนับสนุนเป็นระบบสร้าง (เครดิตกับ Zaucy ที่เสนอเพื่อรักษาไว้)
ในเอกสารด้านล่างฉันจะยังคงอ้างถึง CMake นี่เป็นระบบสร้างอย่างเป็นทางการของห้องสมุด
หากต้องการใช้ EnTT จากโครงการ CMake เพียงเชื่อมโยงเป้าหมายที่มีอยู่กับนามแฝง EnTT::EnTT
ห้องสมุดมีทุกสิ่งที่คุณต้องการสำหรับการค้นหา (เช่นใน find_package ), การฝัง (เช่นใน add_subdirectory ), ดึงข้อมูล (เช่นใน FetchContent ) หรือใช้มันในหลาย ๆ วิธีที่คุณสามารถคิดและที่เกี่ยวข้องกับ CMake
การครอบคลุมกรณีที่เป็นไปได้ทั้งหมดจะต้องมีบทความและไม่ใช่ไฟล์ readme ที่เรียบง่าย แต่ฉันมั่นใจว่าใครก็ตามที่อ่านส่วนนี้ก็รู้ว่ามันเกี่ยวกับอะไรและสามารถใช้ EnTT จากโครงการ CMake โดยไม่มีปัญหา
เมื่อใช้ CMake เพียงเปิดใช้งานตัวเลือก ENTT_INCLUDE_NATVIS และสนุกกับมัน
มิฉะนั้นเครื่องมือส่วนใหญ่จะถูกครอบคลุมผ่าน Natvis และไฟล์ทั้งหมดสามารถพบได้ในไดเรกทอรี 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
พอร์ต EnTT ใน vcpkg ได้รับการปรับปรุงโดยสมาชิกในทีม Microsoft และผู้มีส่วนร่วมในชุมชน
หากเวอร์ชันล้าสมัยโปรดสร้างปัญหาหรือดึงคำขอบนที่เก็บ vcpkg
Homebrew ผู้จัดการแพ็คเกจที่หายไปสำหรับ MacOS
มีให้เป็นสูตร homebrew เพียงพิมพ์ต่อไปนี้เพื่อติดตั้ง:
brew install skypjack/entt/entt
build2 , สร้างเครื่องมือสำหรับการพัฒนาและบรรจุภัณฑ์ C และ C ++ รหัส
ในการใช้แพ็คเกจ entt ในโครงการ build2 ให้เพิ่มบรรทัดต่อไปนี้หรือไฟล์ที่คล้ายกันกับไฟล์ manifest :
depends: entt ^3.0.0
ตรวจสอบด้วยว่าการกำหนดค่าหมายถึงที่เก็บข้อมูลที่ถูกต้องเพื่อให้สามารถพบแพ็คเกจโดย 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 หรือเพิ่มใน repositories.manifest โครงการ Manifest ดูเอกสารอย่างเป็นทางการสำหรับรายละเอียดเพิ่มเติม
bzlmod ระบบการจัดการการพึ่งพาภายนอกของ Bazel
หากต้องการใช้โมดูล entt ในโครงการ bazel ให้เพิ่มไฟล์ต่อไปนี้ในไฟล์ MODULE.bazel ของคุณ:
bazel_dep ( name = "entt" , version = "3.12.2" ) ENTT จะพร้อมใช้งานเป็น @entt (สั้นสำหรับ @entt//:entt ) ที่จะใช้ใน cc_* deps กฎของคุณ
พิจารณารายการนี้กำลังดำเนินการอยู่และช่วยให้ฉันทำให้นานขึ้นหากคุณต้องการ
EnTT ยังรองรับ pkg-config (สำหรับคำจำกัดความของ การสนับสนุน อย่างน้อย) ไฟล์ที่เหมาะสมที่เรียกว่า entt.pc ถูกสร้างและติดตั้งในไดเรกทอรีที่เหมาะสมเมื่อเรียกใช้ CMake
สิ่งนี้ควรทำให้ง่ายต่อการใช้งานกับเครื่องมือเช่น Meson หรือคล้ายกัน
เอกสารขึ้นอยู่กับ Doxygen เพื่อสร้าง:
$ cd build
$ cmake .. -DENTT_BUILD_DOCS=ON
$ make
การอ้างอิง API ถูกสร้างขึ้นในรูปแบบ HTML ในไดเรกทอรี build/docs/html เพื่อนำทางด้วยเบราว์เซอร์ที่คุณชื่นชอบ:
$ cd build
$ your_favorite_browser docs/html/index.html
เวอร์ชันเดียวกันยังมีให้ออนไลน์สำหรับรีลีสล่าสุดนั่นคือแท็กที่มีเสถียรภาพสุดท้าย
นอกจากนี้ยังมีวิกิที่อุทิศให้กับโครงการที่ผู้ใช้สามารถค้นหาหน้าเอกสารที่เกี่ยวข้องทั้งหมด
ในการรวบรวมและเรียกใช้การทดสอบ EnTT ต้องใช้ googletest
cmake ดาวน์โหลดและรวบรวมไลบรารีก่อนที่จะรวบรวมสิ่งอื่นใด ในการสร้างการทดสอบให้ตั้งค่าตัวเลือก CMake ENTT_BUILD_TESTING เป็น ON
เพื่อสร้างชุดการทดสอบขั้นพื้นฐานที่สุด:
$ cd build$ cmake -DENTT_BUILD_TESTING=ON ..$ make$ make testโปรดทราบว่ามาตรฐานไม่ได้เป็นส่วนหนึ่งของชุดนี้
EnTT ใช้กันอย่างแพร่หลายในแอปพลิเคชันส่วนตัวและเชิงพาณิชย์ ฉันไม่สามารถพูดถึงพวกเขาส่วนใหญ่ได้เพราะลายเซ็นบางอย่างที่ฉันใส่ไว้ในเอกสารบางครั้งที่ผ่านมา โชคดีที่มีคนที่ใช้เวลาในการดำเนินโครงการโอเพ่นซอร์สตาม EnTT และไม่หยุดยั้งเมื่อมันมาถึงการบันทึกพวกเขา
ที่นี่คุณสามารถค้นหารายการเกมแอปพลิเคชันและบทความที่ไม่สมบูรณ์ที่สามารถใช้เป็นข้อมูลอ้างอิงได้
หากคุณรู้แหล่งข้อมูลอื่น ๆ ที่เกี่ยวกับ EnTT อย่าลังเลที่จะเปิดปัญหาหรือการประชาสัมพันธ์และฉันจะดีใจที่ได้เพิ่มพวกเขาลงในรายการ
การร้องขอคุณสมบัติ PRS คำแนะนำและข้อเสนอแนะได้รับการชื่นชมอย่างมาก
หากคุณพบว่าคุณสามารถช่วยเหลือและต้องการมีส่วนร่วมในโครงการด้วยประสบการณ์ของคุณหรือคุณต้องการที่จะได้รับส่วนหนึ่งของโครงการด้วยเหตุผลอื่น ๆ โปรดติดต่อฉันโดยตรง (คุณสามารถค้นหาอีเมลในโปรไฟล์)
ฉันไม่สามารถสัญญาได้ว่าการบริจาคทุกครั้งจะได้รับการยอมรับ แต่ฉันสามารถรับรองได้ว่าฉันจะทำให้ดีที่สุดเพื่อให้พวกเขาทั้งหมดโดยเร็วที่สุด
หากคุณตัดสินใจที่จะเข้าร่วมโปรดดูแนวทางสำหรับการมีส่วนร่วมก่อนที่จะสร้างปัญหาหรือดึงคำขอ
ลองดูรายชื่อผู้สนับสนุนเพื่อทราบว่าใครเข้าร่วมจนถึงตอนนี้
รหัสและเอกสารลิขสิทธิ์ (C) 2017-2024 Michele Caini
ลิขสิทธิ์โลโก้สีสัน (C) 2018-2021 Richard Caseres
รหัสที่เผยแพร่ภายใต้ใบอนุญาต MIT
เอกสารที่เผยแพร่ภายใต้ CC ภายใน 4.0
โลโก้ทั้งหมดที่เปิดตัวภายใต้ CC BY-SA 4.0