рдИрд╕реАрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЫрд╡рд┐

рдЗрд╕ рд╣рдлреНрддреЗ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡рд╛рдЧрд╛рдмреЛрдВрдб рдЗрдВрдЬрди рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдЗрдХрд╛рдИ-рдШрдЯрдХ-рдкреНрд░рдгрд╛рд▓реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ GitHub рдкрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреИрд╕реЗ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рдереАред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рдерд╛, рдЗрд╕рдХреА рддрд╛рдХрдд рдФрд░ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рджрд┐рдЦрд╛рдПрдВ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ред рдЕрдВрдд рдореЗрдВ рдореИрдВ рдЙрди рдкрд╣рд▓реБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреВрдВрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдФрд░ рднреА рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд░рд┐рдЪрдп


рдкреНрд░реЗрд░рдгрд╛


рдореИрдВ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдИрд╕реАрдПрд╕ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭрд╕реЗ рдкрд╣рд▓реЗ рдХрдИ рд▓реЛрдЧ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рд╕реНрдХреЙрдЯ рдмрд┐рд▓рд╛рд╕ рдЬреАрдбреАрд╕реА 2002 рдореЗрдВ рдИрд╕реАрдПрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдереЗред рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рдЕрдиреНрдп рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдкрд░рд┐рдЪрдп рдореЗрдВ рдорд╛рдЗрдХ рд╡реЗрд╕реНрдЯ рдХрд╛ рдЗрд╡реЙрд▓реНрд╡ рдпреЛрд░ рд╣рд┐рдпрд░рд╛рд░реНрдХреА рдФрд░ рд░реЙрдмрд░реНрдЯреНрд╕ рдирд┐рд╕реНрдЯреНрд░реЛрдо рдХреЗ рд╕реНрдЯрдирд┐рдВрдЧ рдЧреЗрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреИрдЯрд░реНрди рд╕реЗ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдЪреИрдкреНрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдИрд╕реАрдПрд╕ рдХрд╛ рдХрд╛рд░реНрдп рдЦреЗрд▓ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛-рдЙрдиреНрдореБрдЦ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдбреЗрдЯрд╛ рдФрд░ рд▓реЙрдЬрд┐рдХ рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреГрдердХреНрдХрд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИред рдЗрдХрд╛рдЗрдпрд╛рдБ рдбреЗрдЯрд╛ рдпреБрдХреНрдд рдШрдЯрдХреЛрдВ рд╕реЗ рдмрдиреА рд╣реЛрддреА рд╣реИрдВред рдФрд░ рддрд░реНрдХ рдпреБрдХреНрдд рд╕рд┐рд╕реНрдЯрдо рдЗрди рдШрдЯрдХреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдмрдЬрд╛рдп, рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдИрд╕реАрдПрд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдбреЗрдЯрд╛-рдЙрдиреНрдореБрдЦ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреИрд╢ рдХрд╛ рдмреЗрд╣рддрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг


рдХреЛрдб рдореЗрдВ рдбреАрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдШрдЯрдХреЛрдВ рдХреЛ рд╕реМрдВрдкрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

struct Position : public Component<Position> { float x; float y; }; struct Velocity : public Component<Velocity> { float x; float y; }; 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо CRTP рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдлрд┐рд░, рддрдХрдиреАрдХреА рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдЬрд┐рд╕реЗ рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛, рд╣рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 constexpr auto ComponentCount = 32; constexpr auto SystemCount = 8; 

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓реЗ рдЬрд╛рдПрдЧреА рдЬрд┐рд╕рдореЗрдВ рджреЛрдиреЛрдВ рдШрдЯрдХ рд╣реЛрдВрдЧреЗ рдФрд░ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ:

 class PhysicsSystem : public System<ComponentCount, SystemCount> { public: PhysicsSystem(EntityManager<ComponentCount, SystemCount>& entityManager) : mEntityManager(entityManager) { setRequirements<Position, Velocity>(); } void update(float dt) { for (const auto& entity : getManagedEntities()) { auto [position, velocity] = mEntityManager.getComponents<Position, Velocity>(entity); position.x += velocity.x * dt; position.y += velocity.y * dt; } } private: EntityManager<ComponentCount, SystemCount>& mEntityManager; }; 

рд╕рд┐рд╕реНрдЯрдо рдмрд╕ рдЕрдкрдиреЗ setRequirements рдШрдЯрдХреЛрдВ рдХреЛ setRequirements рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП setRequirements рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░, update рд╡рд┐рдзрд┐ рдореЗрдВ, рдпрд╣ getManagedEntities рдХреЛ рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдЪрд▓реЛ рдПрдХ рдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рдШрдЯрдХреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдХрдИ рдЗрдХрд╛рдЗрдпрд╛рдБ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдкрджреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:

 auto manager = EntityManager<ComponentCount, SystemCount>(); manager.registerComponent<Position>(); manager.registerComponent<Velocity>(); auto system = manager.createSystem<PhysicsSystem>(manager); for (auto i = 0; i < 10; ++i) { auto entity = manager.createEntity(); manager.addComponent<Position>(entity); manager.addComponent<Velocity>(entity); } auto dt = 1.0f / 60.0f; while (true) system->update(dt); 

рдорд╛рдирдХ


рдореИрдВ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдИрд╕реАрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХрд╛ рдвреЛрдВрдЧ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдмрд╕ рдЗрд╕реЗ рдЦреБрдж рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рднрд╛рд╡реА рдХреБрдЫ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рддреЛ рдЪрд▓реЛ рдорд╛рдирдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

  • рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдерд╛рдПрдБ рдмрдирд╛рдПрдВрдЧреЗ;
  • рджреВрд╕рд░рд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд░реВрдк рд╕реЗ рдкрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛;
  • рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдирд╖реНрдЯ рдХрд░реЗрдВрдЧреЗ;

рдЗрди рд╕рднреА рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдШрдЯрдХреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рд╣реИрдВред рдЗрд╕ рддрд░рд╣, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдКрдВрдЧрд╛:

  • рдкреНрд░реЛрдлрд╛рдЗрд▓ рдП: 32 рдШрдЯрдХ рдФрд░ 16 рд╕рд┐рд╕реНрдЯрдо;
  • рдПрдП рдкреНрд░реЛрдлрд╛рдЗрд▓: 128 рдШрдЯрдХ рдФрд░ 32 рд╕рд┐рд╕реНрдЯрдо;
  • рдПрдПрдП рдкреНрд░реЛрдлрд╛рдЗрд▓: 512 рдШрдЯрдХ рдФрд░ 64 рд╕рд┐рд╕реНрдЯрдоред

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рджреЗрдВрдЧреЗ, рд╡реЗ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрди рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рд╕рдЬрд╛рддреАрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдШрдЯрдХ рдЫреЛрдЯреЗ рд╣реЛрддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╕рд╛рд░


рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдПрдХ рдЗрдХрд╛рдИ рд╕рд┐рд░реНрдл рдПрдХ рдЖрдИрдбреА рд╣реИ:

 using Entity = uint32_t; 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Entity.h рдореЗрдВ рд╣рдо рдПрдХ рдЙрдкрдирд╛рдо Index рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧрд╛:

 using Index = uint32_t; static constexpr auto InvalidIndex = std::numeric_limits<Index>::max(); 

рдореИрдВрдиреЗ рд╕реНрдерд╛рди рдмрдЪрд╛рдиреЗ рдФрд░ рдХреИрд╢ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 64-рдмрд┐рдЯ рдкреНрд░рдХрд╛рд░ рдпрд╛ std::size_t рдмрдЬрд╛рдп uint32_t рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рд╣рдо рдЗрддрдирд╛ рдирд╣реАрдВ рд╣рд╛рд░реЗрдВрдЧреЗ: рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЕрд░рдмреЛрдВ рдЗрдХрд╛рдЗрдпрд╛рдВ рд╣реЛрдВрдЧреАред

рдЕрдВрдЧ


рдЕрдм рдШрдЯрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 template<typename T, auto Type> class Component { public: static constexpr auto type = static_cast<std::size_t>(Type); }; 

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдЯрд╛рдЗрдк рдЖрдИрдбреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдмрд╛рдж рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдШрдЯрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред

рдкрд╣рд▓рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдШрдЯрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рджреВрд╕рд░рд╛ std::size_t рдХрдирд╡рд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╣реИ, рдЬреЛ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рдЖрдИрдбреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдШрдЯрдХ рдШрдЯрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 struct Positon : Component<Position, 0> { float x; float y; }; 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЧрдгрдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддреА рд╣реИ:

 enum class ComponentType { Position }; struct Positon : Component<Position, ComponentType::Position> { float x; float y; }; 

рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ: рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдЖрдИрдбреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╛рдж рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░реЗрдВ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред

EntityContainer


EntityContainer рд╡рд░реНрдЧ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ std::bitset рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред рдмрд┐рдЯреНрд╕ рдХрд╛ рдпрд╣ рд╕реЗрдЯ рдЙрди рдШрдЯрдХреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдЗрдХрд╛рдИ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИред

рдЪреВрдВрдХрд┐ рд╣рдо рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ std::vector , рд╣рдореЗрдВ рдЖрдИрдбреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛ рдФрд░ рдХрдо рдореЗрдореЛрд░реА рд▓реЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдирд╖реНрдЯ рдХреА рдЧрдИ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдЖрдИрдбреА рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдлреНрдд рдЖрдИрдбреА рдХреЛ mFreeEntities рдирд╛рдордХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣рд╛рдБ EntityContainer :

 template<std::size_t ComponentCount, std::size_t SystemCount> class EntityContainer { public: void reserve(std::size_t size); std::vector<std::bitset<ComponentCount>>& getEntityToBitset(); const std::bitset<ComponentCount>& getBitset(Entity entity) const; Entity create(); void remove(Entity entity); private: std::vector<std::bitset<ComponentCount>> mEntityToBitset; std::vector<Entity> mFreeEntities; }; 

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рддрд░реАрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

getEntityToBitset рдФрд░ getBitset рд╕рд╛рдорд╛рдиреНрдп рдЫреЛрдЯреЗ getBitset рд╣реИрдВ:

 std::vector<std::bitset<ComponentCount>>& getEntityToBitset() { return mEntityToBitset; } const std::bitset<ComponentCount>& getBitset(Entity entity) const { return mEntityToBitset[entity]; } 

create рд╡рд┐рдзрд┐ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ:

 Entity create() { auto entity = Entity(); if (mFreeEntities.empty()) { entity = static_cast<Entity>(mEntityToBitset.size()); mEntityToBitset.emplace_back(); } else { entity = mFreeEntities.back(); mFreeEntities.pop_back(); mEntityToBitset[entity].reset(); } return entity; } 

рдпрджрд┐ рдХреЛрдИ рд╕реНрд╡рддрдВрддреНрд░ рд╕рдВрд╕реНрдерд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЗрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╡рд┐рдзрд┐ рдПрдХ рдирдИ рдЗрдХрд╛рдИ рдмрдирд╛рддреА рд╣реИред

remove рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдЗрдХрд╛рдИ рдХреЛ mFreeEntities рдореЗрдВ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП mFreeEntities :

 void remove(Entity entity) { mFreeEntities.push_back(entity); } 

рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ reserve ред рдЗрд╕рдХрд╛ рдХрд╛рдо рд╡рд┐рднрд┐рдиреНрди рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рд▓рдЧрднрдЧ рдЧреЗрдо рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рдЬрд░реНрд╡ рдореЗрдореЛрд░реА рдХрд╛рдо рдХреЛ рдЧрддрд┐ рджреЗрдЧрд╛:

 void reserve(std::size_t size) { mFreeEntities.resize(size); std::iota(std::begin(mFreeEntities), std::end(mFreeEntities), 0); mEntityToBitset.resize(size); } 

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЗрдореЛрд░реА рдмреИрдХрдЕрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ mFreeEntities рднреА рдЖрдмрд╛рдж mFreeEntities ред

ComponentContainer


ComponentContainer рд╡рд░реНрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред

рдореЗрд░реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ, рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рд╕рд░рдгреА рд╣реИ, рдЬрд┐рд╕реЗ mComponents рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐рд╕реА рд╕рдВрд╕реНрдерд╛ рд╕реЗ рдХрд┐рд╕реА рдШрдЯрдХ рдХреЛ рдирд┐рд░рдВрддрд░ рд╕рдордп рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ, рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЗрдХрд╛рдИ рд╕реЗ рдПрдХ рдШрдЯрдХ рддрдХ рдФрд░ рдШрдЯрдХ рд╕реЗ рдЗрдХрд╛рдИ рддрдХ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ mComponentToEntity рдФрд░ mEntityToComponent рдирд╛рдордХ рджреЛ рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА mEntityToComponent ред

рдЗрд╕ ComponentContainer рдШреЛрд╖рдгрд╛ рд╣реИ:

 template<typename T, std::size_t ComponentCount, std::size_t SystemCount> class ComponentContainer : public BaseComponentContainer { public: ComponentContainer(std::vector<std::bitset<ComponentCount>>& entityToBitset); virtual void reserve(std::size_t size) override; T& get(Entity entity); const T& get(Entity entity) const; template<typename... Args> void add(Entity entity, Args&&... args); void remove(Entity entity); virtual bool tryRemove(Entity entity) override; Entity getOwner(const T& component) const; private: std::vector<T> mComponents; std::vector<Entity> mComponentToEntity; std::unordered_map<Entity, Index> mEntityToComponent; std::vector<std::bitset<ComponentCount>>& mEntityToBitset; }; 

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ BaseComponentContainer рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ BaseComponentContainer , рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рд╣реИ:

 class BaseComponentContainer { public: virtual ~BaseComponentContainer() = default; virtual void reserve(std::size_t size) = 0; virtual bool tryRemove(Entity entity) = 0; }; 

рдЗрд╕ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ ComponentContainer рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реИред

рдЖрдЗрдП рдЕрдм рд╣рдо рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрдЦреЗрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдЗрд╕реЗ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕реЗрдЯ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджрд░реНрдн рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдХрд┐рд╕реА рдЗрдХрд╛рдИ рдореЗрдВ рдПрдХ рдШрдЯрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рдШрдЯрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рдПрдХ рдШрдЯрдХ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕реЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛:

 ComponentContainer(std::vector<std::bitset<ComponentCount>>& entityToBitset) : mEntityToBitset(entityToBitset) { } 

get рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕рд░рд▓ рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл mEntityToComponent рдореЗрдВ рдПрдХ рдЗрдХрд╛рдИ рдШрдЯрдХ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП mEntityToComponent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

 T& get(Entity entity) { return mComponents[mEntityToComponent[entity]]; } 

add рд╡рд┐рдзрд┐ mComponents рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдирдпрд╛ рдШрдЯрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ mComponents , рдФрд░ рдлрд┐рд░ рдпрд╣ рдЗрдХрд╛рдИ рд╕реЗ рдШрдЯрдХ рдФрд░ рдШрдЯрдХ рд╕реЗ рдЗрдХрд╛рдИ рддрдХ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рддреИрдпрд╛рд░ рдХрд░рддреА рд╣реИред рдЕрдВрдд рдореЗрдВ, рдпрд╣ entity рдмрд┐рдЯ рд╕реЗрдЯ рдХреЗ рдмрд┐рдЯ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдШрдЯрдХ рдХреЛ true рдореЗрд▓ рдЦрд╛рддрд╛ true :

 template<typename... Args> void add(Entity entity, Args&&... args) { auto index = static_cast<Index>(mComponents.size()); mComponents.emplace_back(std::forward<Args>(args)...); mComponentToEntity.emplace_back(entity); mEntityToComponent[entity] = index; mEntityToBitset[entity][T::type] = true; } 

remove рд╡рд┐рдзрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдЯ рдШрдЯрдХ рдХреЛ false рд╕реЗрдЯ рдХрд░рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЬрд┐рд╕реЗ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдЕрдВрддрд┐рдо mComponents рдШрдЯрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕ рдШрдЯрдХ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдПрдХ рдШрдЯрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдирд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

 void remove(Entity entity) { mEntityToBitset[entity][T::type] = false; auto index = mEntityToComponent[entity]; // Update mComponents mComponents[index] = std::move(mComponents.back()); mComponents.pop_back(); // Update mEntityToComponent mEntityToComponent[mComponentToEntity.back()] = index; mEntityToComponent.erase(entity); // Update mComponentToEntity mComponentToEntity[index] = mComponentToEntity.back(); mComponentToEntity.pop_back(); } 

рд╣рдо рдЙрд╕ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдореЗрдВ рдЕрдВрддрд┐рдо рдШрдЯрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдирд┐рд░рдВрддрд░-рд╕рдордп рдкрд░ рдЖрдВрджреЛрд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдирд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдлрд┐рд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдШрдЯрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд░рдВрддрд░ рд╕рдордп рдореЗрдВ std::vector рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

tryRemove рд╡рд┐рдзрд┐ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╕рдВрд╕реНрдерд╛ рдХреЗ рдкрд╛рд╕ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рдШрдЯрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВ:

 virtual bool tryRemove(Entity entity) override { if (mEntityToBitset[entity][T::type]) { remove(entity); return true; } return false; } 

getOwner рд╡рд┐рдзрд┐ рдШрдЯрдХ рдХрд╛ рдорд╛рд▓рд┐рдХрд╛рдирд╛ getOwner рд╡рд╛рд▓реА рдЗрдХрд╛рдИ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдФрд░ mComponentToEntity рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

 Entity getOwner(const T& component) const { auto begin = mComponents.data(); auto index = static_cast<std::size_t>(&component - begin); return mComponentToEntity[index]; } 

рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ reserve , рдЗрд╕рдХрд╛ рдПрдХ рд╣реА рдЙрджреНрджреЗрд╢реНрдп рд╣реИ EntityContainer рдореЗрдВ рд╕рдорд╛рди рд╡рд┐рдзрд┐:

 virtual void reserve(std::size_t size) override { mComponents.reserve(size); mComponentToEntity.reserve(size); mEntityToComponent.reserve(size); } 

рдкреНрд░рдгрд╛рд▓реА


рдЕрдм System рдХреНрд▓рд╛рд╕ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ mRequirements рдмрд┐рдЯреНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ mRequirements рд╣реИ рдЬреЛ рдЙрди рдШрдЯрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ mManagedEntities рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдирд┐рд░рдВрддрд░ рд╕рдордп рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЗрдХрд╛рдИ рд╕реЗ рдЗрд╕рдХреЗ mManagedEntities рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ mManagedEntities ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо std::unordered_map рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ mEntityToManagedEntity рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ System рдШреЛрд╖рдгрд╛ рдХреНрдпрд╛ рджрд┐рдЦрддреА рд╣реИ:

 template<std::size_t ComponentCount, std::size_t SystemCount> class System { public: virtual ~System() = default; protected: template<typename ...Ts> void setRequirements(); const std::vector<Entity>& getManagedEntities() const; virtual void onManagedEntityAdded([[maybe_unused]] Entity entity); virtual void onManagedEntityRemoved([[maybe_unused]] Entity entity); private: friend EntityManager<ComponentCount, SystemCount>; std::bitset<ComponentCount> mRequirements; std::size_t mType; std::vector<Entity> mManagedEntities; std::unordered_map<Entity, Index> mEntityToManagedEntity; void setUp(std::size_t type); void onEntityUpdated(Entity entity, const std::bitset<ComponentCount>& components); void onEntityRemoved(Entity entity); void addEntity(Entity entity); void removeEntity(Entity entity); }; 

рдмрд┐рдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП setRequirements рдПрдХ setRequirements рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

 template<typename ...Ts> void setRequirements() { (mRequirements.set(Ts::type), ...); } 

getManagedEntities рдПрдХ рдРрд╕рд╛ getManagedEntities рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдВрд╕реНрдерд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 const std::vector<Entity>& getManagedEntities() const { return mManagedEntities; } 

рдпрд╣ рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ mManagedEntities рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗрдВред

onManagedEntityAdded рдФрд░ onManagedEntityRemoved рд░рд┐рдХреНрдд рд╣реИрдВред рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред mManagedEntities рдПрдХ рдЗрдХрд╛рдИ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдпрд╛ рдЗрд╕реЗ рд╣рдЯрд╛рддреЗ рд╕рдордп рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ рдХреЗрд╡рд▓ EntityManager рдУрд░ рд╕реЗ рдирд┐рдЬреА рдФрд░ рд╕реБрд▓рдн рд╣реЛрдВрдЧреА, рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рджреЛрд╕реНрддрд╛рдирд╛ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

setUp рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЖрдИрдбреА рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддреЛ рдпрд╣ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 void setUp(std::size_t type) { mType = type; } 

onEntityUpdated рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдПрдХ рдЗрдХрд╛рдИ рдмрджрд▓рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдПрдХ рдШрдЯрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдкрд░ред рд╕рд┐рд╕реНрдЯрдо рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ рдФрд░ рдХреНрдпрд╛ рдЗрдХрд╛рдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛ рдЪреБрдХреА рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрднреА рддрдХ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЗрдХрд╛рдИ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛ рдЪреБрдХреА рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

 void onEntityUpdated(Entity entity, const std::bitset<ComponentCount>& components) { auto satisfied = (mRequirements & components) == mRequirements; auto managed = mEntityToManagedEntity.find(entity) != std::end(mEntityToManagedEntity); if (satisfied && !managed) addEntity(entity); else if (!satisfied && managed) removeEntity(entity); } 

onEntityRemoved рдХреЛ рдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЗрдХрд╛рдИ рд╣рдЯрд╛рдП onEntityRemoved рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЗрдХрд╛рдИ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╡рд╣ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддреА рд╣реИ:

 void onEntityRemoved(Entity entity) { if (mEntityToManagedEntity.find(entity) != std::end(mEntityToManagedEntity)) removeEntity(entity); } 

addEntity рдФрд░ removeEntity рд╕рд┐рд░реНрдл рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред

addEntity рдЗрд╕рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реЗ рдЧрдП рдЗрдХрд╛рдИ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрдХрд╛рдИ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ onManagedEntityAdded рдХреЙрд▓ onManagedEntityAdded :

 void addEntity(Entity entity) { mEntityToManagedEntity[entity] = static_cast<Index>(mManagedEntities.size()); mManagedEntities.emplace_back(entity); onManagedEntityAdded(entity); } 

removeEntity рдкрд╣рд▓реЗ рдХреЙрд▓ onManagedEntityRemoved ред рдлрд┐рд░ рдпрд╣ рдЕрдВрддрд┐рдо рд╕рдВрд╕рд╛рдзрд┐рдд рдирд┐рдХрд╛рдп рдХреЛ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдЗрдХрд╛рдИ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдпрд╣ mManagedEntities рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЗрдХрд╛рдИ рдХреЛ mManagedEntities рдФрд░ mEntityToManagedEntity рд╕реЗ рд╣рдЯрд╛ mEntityToManagedEntity :

 void removeEntity(Entity entity) { onManagedEntityRemoved(entity); auto index = mEntityToManagedEntity[entity]; mEntityToManagedEntity[mManagedEntities.back()] = index; mEntityToManagedEntity.erase(entity); mManagedEntities[index] = mManagedEntities.back(); mManagedEntities.pop_back(); } 

EntityManager


рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд░реНрдХ рд╣реИрдВред рдПрдХ рдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рдмрд╕ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдЖрдЗрдП рдЙрдирдХреЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

 template<std::size_t ComponentCount, std::size_t SystemCount> class EntityManager { public: template<typename T> void registerComponent(); template<typename T, typename ...Args> T* createSystem(Args&& ...args); void reserve(std::size_t size); Entity createEntity(); void removeEntity(Entity entity); template<typename T> bool hasComponent(Entity entity) const; template<typename ...Ts> bool hasComponents(Entity entity) const; template<typename T> T& getComponent(Entity entity); template<typename T> const T& getComponent(Entity entity) const; template<typename ...Ts> std::tuple<Ts&...> getComponents(Entity entity); template<typename ...Ts> std::tuple<const Ts&...> getComponents(Entity entity) const; template<typename T, typename... Args> void addComponent(Entity entity, Args&&... args); template<typename T> void removeComponent(Entity entity); template<typename T> Entity getOwner(const T& component) const; private: std::array<std::unique_ptr<BaseComponentContainer>, ComponentCount> mComponentContainers; EntityContainer<ComponentCount, SystemCount> mEntities; std::vector<std::unique_ptr<System<ComponentCount, SystemCount>>> mSystems; template<typename T> void checkComponentType() const; template<typename ...Ts> void checkComponentTypes() const; template<typename T> auto getComponentContainer(); template<typename T> auto getComponentContainer() const; }; 

EntityManager рд╡рд░реНрдЧ рдХреЗ рддреАрди рд╕рджрд╕реНрдп рдЪрд░ рд╣реИрдВ: mComponentContainers , рдЬреЛ std::unique_ptr рдХреЛ BaseComponentContainer , mEntities , рдЬреЛ рдХрд┐ EntityContainer рдФрд░ mSystems рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ System unique_ptr рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд unique_ptr ред

рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реЗ рд╕рднреА рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВред

рдЖрдЗрдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ getComponentContainer рдкрд░ рдПрдХ рдирдЬрд╝рд░ getComponentContainer , рдЬреЛ рдПрдХ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрдВрдЯреЗрдирд░ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк T рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ:

 template<typename T> auto getComponentContainer() { return static_cast<ComponentContainer<T, ComponentCount, SystemCount>*>(mComponentContainers[T::type].get()); } 

рдПрдХ рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди checkComponentType , рдЬреЛ рдмрд╕ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рдЖрдИрдбреА рдЕрдзрд┐рдХрддрдо рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдиреАрдЪреЗ рд╣реИ:

 template<typename T> void checkComponentType() const { static_assert(T::type < ComponentCount); } 

checkComponentTypes рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ checkComponentTypes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

 template<typename ...Ts> void checkComponentTypes() const { (checkComponentType<Ts>(), ...); } 

registerComponent рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рддрд╛ рд╣реИ:

 template<typename T> void registerComponent() { checkComponentType<T>(); mComponentContainers[T::type] = std::make_unique<ComponentContainer<T, ComponentCount, SystemCount>>( mEntities.getEntityToBitset()); } 

createSystem рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдирдИ рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

 template<typename T, typename ...Args> T* createSystem(Args&& ...args) { auto type = mSystems.size(); auto& system = mSystems.emplace_back(std::make_unique<T>(std::forward<Args>(args)...)); system->setUp(type); return static_cast<T*>(system.get()); } 

reserve рд╡рд┐рдзрд┐ ComponentContainer рдФрд░ EntityContainer рдХреЗ reserve рддрд░реАрдХреЛрдВ рдХреЛ рдмреБрд▓рд╛рддреА рд╣реИ:

 void reserve(std::size_t size) { for (auto i = std::size_t(0); i < ComponentCount; ++i) { if (mComponentContainers[i]) mComponentContainers[i]->reserve(size); } mEntities.reserve(size); } 

createEntity рд╡рд┐рдзрд┐ EntityManager рдкреНрд░рдмрдВрдзрдХ рдХреА create рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддреА рд╣реИ:

 Entity createEntity() { return mEntities.create(); } 

hasComponent , рдЗрд╕ рдЗрдХрд╛рдИ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдШрдЯрдХ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдмрд┐рдЯреНрд╕ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

 template<typename T> bool hasComponent(Entity entity) const { checkComponentType<T>(); return mEntities.getBitset(entity)[T::type]; } 

hasComponents рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реБрдП рдмрд┐рдЯреНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдирд╡рд▓реНрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпреВрдирд┐рдЯ рдХреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

 template<typename ...Ts> bool hasComponents(Entity entity) const { checkComponentTypes<Ts...>(); auto requirements = std::bitset<ComponentCount>(); (requirements.set(Ts::type), ...); return (requirements & mEntities.getBitset(entity)) == requirements; } 

getComponent рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

 template<typename T> T& getComponent(Entity entity) { checkComponentType<T>(); return getComponentContainer<T>()->get(entity); } 

getComponents рдЕрдиреБрд░реЛрдзрд┐рдд рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдПрдХ рдЯрдкрд▓ рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ std::tie рдФрд░ рдПрдХ рдХрдирд╡рд▓реНрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

 template<typename ...Ts> std::tuple<Ts&...> getComponents(Entity entity) { checkComponentTypes<Ts...>(); return std::tie(getComponentContainer<Ts>()->get(entity)...); } 

addComponent рдФрд░ removeComponent рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ onEntityUpdated рд╕рд┐рд╕реНрдЯрдо onEntityUpdated рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:

 template<typename T, typename... Args> void addComponent(Entity entity, Args&&... args) { checkComponentType<T>(); getComponentContainer<T>()->add(entity, std::forward<Args>(args)...); // Send message to systems const auto& bitset = mEntities.getBitset(entity); for (auto& system : mSystems) system->onEntityUpdated(entity, bitset); } template<typename T> void removeComponent(Entity entity) { checkComponentType<T>(); getComponentContainer<T>()->remove(entity); // Send message to systems const auto& bitset = mEntities.getBitset(entity); for (auto& system : mSystems) system->onEntityUpdated(entity, bitset); } 

рдЕрдВрдд рдореЗрдВ, getOwner рдЖрд╡рд╢реНрдпрдХ рдХрдВрдЯреЗрдирд░ рдШрдЯрдХ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

 template<typename T> Entity getOwner(const T& component) const { checkComponentType<T>(); return getComponentContainer<T>()->getOwner(component); } 

рдпрд╣ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдерд╛ред рдЗрд╕рдореЗрдВ рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 357 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╕рднреА рдХреЛрдб рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ


рдорд╛рдирдХ


рдЕрдм рдореЗрд░реЗ рдкрд╣рд▓реЗ рдИрд╕реАрдПрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!

рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:




рдЯреЗрдореНрдкрд▓реЗрдЯ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рддрд░рд╛рдЬреВ! рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓ (рдП, рдПрдП рдФрд░ рдПрдПрдП) рдмрджрд▓рддреЗ рд╕рдордп рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╕рдВрд╕рд╛рдзрд┐рдд рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рддрд░рд╛рдЬреВ рд╣реИред рдЬрдм рд╣рдо рддреАрди рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдПрдХ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреАрди рдЧреБрдирд╛ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рддреАрди рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреИрд╢ рдЫреВрдЯ рдЬрд╛рддрд╛ рд╣реИ


рдХреИрд╢ рдорд┐рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдХреИрд╢рдЧреНрд░рд┐рдВрдб рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ ред

рдпрд╣рд╛рдБ 10,000 рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд╣реИ:

==1652== D refs: 277,577,353 (254,775,159 rd + 22,802,194 wr)
==1652== D1 misses: 20,814,368 ( 20,759,914 rd + 54,454 wr)
==1652== LLd misses: 43,483 ( 7,847 rd + 35,636 wr)
==1652== D1 miss rate: 7.5% ( 8.1% + 0.2% )
==1652== LLd miss rate: 0.0% ( 0.0% + 0.2% )


рдпрд╣рд╛рдБ 100,000 рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд╣реИ:

==1738== D refs: 2,762,879,670 (2,539,368,564 rd + 223,511,106 wr)
==1738== D1 misses: 207,415,181 ( 206,902,072 rd + 513,109 wr)
==1738== LLd misses: 207,274,328 ( 206,789,289 rd + 485,039 wr)
==1738== D1 miss rate: 7.5% ( 8.1% + 0.2% )
==1738== LLd miss rate: 7.5% ( 8.1% + 0.2% )


рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВред рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ рдХрд┐ 100,000 рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рдЗрддрдиреЗ рд╕рд╛рд░реЗ LLD рдорд┐рд╕ рдХреНрдпреЛрдВ рд╣реИрдВред

рд░реВрдкрд░реЗрдЦрд╛


рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд┐рди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЧреИрд░-рд▓рд╛рднрдХрд╛рд░реА рдорд╛рдирд╛ рд╣реИ ред

рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

Flat profile:

Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
57.45 1.16 1.16 200300000 0.00 0.00 std::__detail::_Map_base<unsigned int, std::pair<unsigned int const, unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int> >, std::__detail::_Select1st, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true>, true>::operator[](unsigned int const&)
19.31 1.55 0.39 main
16.34 1.88 0.33 200500000 0.00 0.00 std::_Hashtable<unsigned int, std::pair<unsigned int const, unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int> >, std::__detail::_Select1st, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::_M_find_before_node(unsigned long, unsigned int const&, unsigned long) const
3.96 1.96 0.08 300000 0.00 0.00 std::_Hashtable<unsigned int, std::pair<unsigned int const, unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int> >, std::__detail::_Select1st, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::_M_insert_unique_node(unsigned long, unsigned long, std::__detail::_Hash_node<std::pair<unsigned int const, unsigned int>, false>*)
2.48 2.01 0.05 300000 0.00 0.00 unsigned int& std::vector<unsigned int, std::allocator<unsigned int> >::emplace_back<unsigned int&>(unsigned int&)
0.50 2.02 0.01 3 3.33 3.33 std::_Hashtable<unsigned int, std::pair<unsigned int const, unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int> >, std::__detail::_Select1st, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::~_Hashtable()
0.00 2.02 0.00 200000 0.00 0.00 std::_Hashtable<unsigned int, std::pair<unsigned int const, unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int> >, std::__detail::_Select1st, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >::find(unsigned int const&)


рдкрд░рд┐рдгрд╛рдо рдереЛрдбрд╝рд╛ рд╡рд┐рдХреГрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ -O1 рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, -O1 рдХреБрдЫ рд╕рд╛рд░реНрдердХ -O1 ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЕрдиреБрдХреВрд▓рди рд╕реНрддрд░ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдХреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЧреНрд░реЗрдлрд╛рдЗрдЯ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред

рдЧреНрд░рд┐рдк рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдЕрдбрд╝рдЪрди std::unordered_map ред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ std::map


рдореИрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддреНрд╕реБрдХ рд╣реЛ рдЧрдпрд╛ , std::unordered_mapрдФрд░ std::mapрдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЛрдб рдХреЗ std::unordered_mapрд╕рд╛рде рд╕рдм рдХреБрдЫ рдмрджрд▓ рджрд┐рдпрд╛ std::mapред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдпрд╣рд╛рдБ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:




рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдмрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ 1000 рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рджреЛрдЧреБрдирд╛ рд╣реИ std::unordered_mapред

рдирд┐рд╖реНрдХрд░реНрд╖


рд╣рдордиреЗ рдЗрдХрд╛рдИ-рдШрдЯрдХ-рдкреНрд░рдгрд╛рд▓реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рд╕реБрдзрд╛рд░ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдиреАрдВрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдХреИрд╕реЗ рдмрджрд▓ рдХрд░ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ std::unordered_mapрдкрд░ std::vectorред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдИрдбреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реИред

Std рдХреА рдЬрдЧрд╣ :: unordered_map std рдХреЗ рд╕рд╛рде :: рд╡реЗрдХреНрдЯрд░


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛, рд╡реЗ std::unordered_mapрд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдЕрдбрд╝рдЪрди рдереЗред рдЗрд╕рд▓рд┐рдП, std::unordered_mapрд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореЗрдВ рдФрд░ рд╡реИрдХреНрдЯрд░ рдХреЗ mEntityToComponentрд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ редComponentContainermEntityToManagedEntitySystemstd::vector

рдкрд░рд┐рд╡рд░реНрддрди


рдкрд░рд┐рд╡рд░реНрддрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдВрдЧреЗ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореЗрдВ рдХреЗрд╡рд▓ рд╕реВрдХреНрд╖реНрдорддрд╛ рдЭреВрда vectorрдореЗрдВ mEntityToComponentрдФрд░ mEntityToManagedEntityрдХрд╛рдлреА рджреЗрд░ рддрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕рдВрд╕реНрдерд╛ рдХреА рдЧрдИ рд╣реИред рдЗрд╕ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрди рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ vectorрдореЗрдВ EntityContainer, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдзрд┐рдХрддрдо рдЖрдИрдбреА рдЗрдХрд╛рдИ рдкрддрд╛ рд╣реИред рдлрд┐рд░ рдореИрдВ vectorрдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ рд╕рдВрджрд░реНрдн рдпрд╛ рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдШрдЯрдХ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рд╡реИрдХреНрдЯрд░ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ ред

рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХреЛрдб рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдкрд░рд┐рдгрд╛рдо


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:




рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдШрдЯрдХреЛрдВ рдФрд░ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛ рдереЛрдбрд╝рд╛
рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдмрд╣реБрдд рддреЗрдЬ рд╣реЛ рдЧрдИ рд╣реИ, рд▓рдЧрднрдЧ рджрд╕ рдЧреБрдирд╛! рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рддрд░рд╛рдЬреВред рдпрд╣ рд╕реНрдкреАрдбрдЕрдк рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рд▓реЛрдкрди рдХреА рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ: рдЗрдХрд╛рдИ рдХрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрдИ рдмрд╛рд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдФрд░ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рд╕реЗ рдХреИрд╢ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдореА рдЖрддреА рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрд╣рд╛рдБ 10,000 рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреИрд╢рдЧреНрд░рд┐рдВрдб рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ: рдФрд░ рдпрд╣рд╛рдБ 100,000 рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рд╣реИ: рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рд▓рдЧрднрдЧ рддреАрди рдЧреБрдирд╛ рдХрдо рд▓рд┐рдВрдХ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЪрд╛рд░ рдмрд╛рд░ рдХрдо рдХреИрд╢ рдорд┐рд╕ рдХрд░рддрд╛ рд╣реИред

==1374== D refs: 94,563,949 (72,082,880 rd + 22,481,069 wr)
==1374== D1 misses: 4,813,780 ( 4,417,702 rd + 396,078 wr)
==1374== LLd misses: 378,905 ( 9,626 rd + 369,279 wr)
==1374== D1 miss rate: 5.1% ( 6.1% + 1.8% )
==1374== LLd miss rate: 0.4% ( 0.0% + 1.6% )




==1307== D refs: 938,405,796 (715,424,940 rd + 222,980,856 wr)
==1307== D1 misses: 51,034,738 ( 44,045,090 rd + 6,989,648 wr)
==1307== LLd misses: 5,866,508 ( 1,997,948 rd + 3,868,560 wr)
==1307== D1 miss rate: 5.4% ( 6.2% + 3.1% )
==1307== LLd miss rate: 0.6% ( 0.3% + 1.7% )




рдСрдЯреЛ рдкреНрд░рдХрд╛рд░


рдЕрдВрддрд┐рдо рд╕реБрдзрд╛рд░ рдореИрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреАрдврд╝реАред

рдкрд░рд┐рд╡рд░реНрддрди


рдЖрдИрдбреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреАрдврд╝реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдпрд╣рд╛рдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ CRTP рдФрд░ рдПрдХ рд╕реНрдереИрддрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 template<typename T> class Component { public: static const std::size_t type; }; std::size_t generateComponentType() { static auto counter = std::size_t(0); return counter++; } template<typename T> const std::size_t Component<T>::type = generateComponentType(); 

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдк рдЖрдИрдбреА рдЕрдм рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рд╣реИ, рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред

рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж рдХрд╛ рдХреЛрдб рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдкрд░рд┐рдгрд╛рдо


рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд┐рдпрд╛:




рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рд▓реЛрдкрди рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдо рд▓рдЧрднрдЧ рд╕рдорд╛рди рдереЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪрд▓рдирд╛ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓рдЧрднрдЧ 10%ред

рдЗрд╕ рдордВрджреА рдХреЛ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдирдХрд░реНрддрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЯрд╛рдЗрдк рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬрд╛рдирддрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЖрдИрдбреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореИрдиреБрдЕрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдереЛрдбрд╝рд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рднрд▓реЗ рд╣реА рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░ рджреЗрдВ, рдлрд┐рд░ рднреА рдпрд╣ рд╣рдорд╛рд░реЗ рдИрд╕реАрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реИред

рдЖрдЧреЗ рдХреЗ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░


рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЕрдм рддрдХ рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд░реВрдВрдЧрд╛ред

рдШрдЯрдХреЛрдВ рдФрд░ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдЦреНрдпрд╛


рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдШрдЯрдХреЛрдВ рдФрд░ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛ std::arrayрдореЗрдВ EntityManagerрдкрд░ std::vectorрдПрдХ рдордЬрдмреВрдд рдкреНрд░рджрд░реНрд╢рди рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рдмрд┐рдирд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ std::bitsetрд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрдм рдореИрдВ рдмрджрд▓ рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ std::vector<bitset<ComponentCount>>рдореЗрдВ EntityContainerрдкрд░ std::vector<char>рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЬрд╛рд░реА рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗред рдлрд┐рд░ рд╣рдо рдПрдХ рд╣рд▓реНрдХреЗ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ BitsetViewрдЬреЛ рдЗрдирдкреБрдЯ рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕реЗрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ std::bitsetрдЗрд╕ рдореЗрдореЛрд░реА рд░реЗрдВрдЬ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ ред

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░: рдЕрдм рдмрд┐рдЯ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдФрд░ рдХреЗрд╡рд▓ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВ mEntityToComponentрдХрд┐ рдЗрдХрд╛рдИ рдореЗрдВ рдШрдЯрдХ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рд╕рд░рд▓реАрдХреГрдд рдШрдЯрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐


рдлрд┐рд▓рд╣рд╛рд▓, рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЪрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 for (const auto& entity : getManagedEntities()) { auto [position, velocity] = mEntityManager.getComponents<Position, Velocity>(entity); ... } 

рдЕрдЧрд░ рд╣рдо рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рдФрд░ рд╕рд░рд▓ рд╣реЛрдЧрд╛:

 for (auto& [position, velocity] : mEntityManager.getComponents<Position, Velocity>(mManagedEntities)) { ... } 

std::view::transformрд╕реА ++ 20 рдореЗрдВ рд░реЗрдВрдЬ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдорджрдж
рд╕реЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдПрд░рд┐рдХ рдирд┐рдмрд▓рд░ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ , рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ред рд╕рдорд╛рдзрд╛рди рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдирд┐рд░реНрдорд╛рдг рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЗрдХрд╛рдИ рд╕рдВрджрд░реНрдн ред рдлрд┐рд░ рд╣рдо рдХреЗрд╡рд▓ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдбрд╝рддрд╛ рдерд╛ , рдФрд░ рдЗрдЯрд░реЗрдЯрд░ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред



EntityRangeViewstd::vectorbeginend

рдШрдЯрдирд╛ рдкреНрд░рдмрдВрдзрди рдЕрдиреБрдХреВрд▓рди


рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХрд┐рд╕реА рдЗрдХрд╛рдИ рд╕реЗ рдПрдХ рдШрдЯрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдкрд░, рд╣рдо onEntityUpdatedрд╕рднреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдХреНрд╖рдо рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рд╕рд┐рд╕реНрдЯрдо рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХ рдореЗрдВ рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА-рдЕрднреА рдмрджрд▓реЗ рдЧрдП рд╣реИрдВред

рдХреНрд╖рддрд┐ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ std::array<std::vector<System<ComponentCount, SystemCount>>, ComponentCount>ред рдлрд┐рд░, рдХрд┐рд╕реА рдШрдЯрдХ рдХреЛ рдЬреЛрдбрд╝рддреЗ рдпрд╛ рд╣рдЯрд╛рддреЗ рд╕рдордп, рд╣рдо рдмрд╕ onEntityUpdatedрдЗрд╕ рдШрдЯрдХ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣реЗрдВрдЧреЗ ред

рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрдЬрд╛рдп рдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди


рдореЗрд░реЗ рдЕрдВрддрд┐рдо рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдВрдЧреЗред

рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрдЬрд╛рдп рдЬреЛ рдЙрдирдХреЗ рд╕реЗрдЯ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рдРрд╕рд╛ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рддрд░рд╣ рдХреА рдпреЛрдЬрдирд╛ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рджреЛ рд╕рд┐рд╕реНрдЯрдо рд╕рдорд╛рди рдШрдЯрдХреЛрдВ рдХреЗ рд╕рдореВрд╣ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╕рд┐рд╕реНрдЯрдо рдХреЗрд╡рд▓ рдПрдХ рдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рдЗрдХрд╛рдИ рдкреНрд░рдмрдВрдзрдХ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░реЗрдЧрд╛:

 for (const auto& entity : mEntityManager.getEntitiesWith<Position, Velocity>()) { ... } 

рдирд┐рд╖реНрдХрд░реНрд╖


рдЕрдм рддрдХ рдпрд╣ рдЗрдХрд╛рдИ-рдШрдЯрдХ-рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдЕрдВрдд рд╣реИред рдпрджрд┐ рдореИрдВ рдЕрдиреНрдп рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирдП рд▓реЗрдЦ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдЗрд╕рдореЗрдВ рдХреЛрдб рдХреА 500 рд╕реЗ рдХрдо рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рднреА рд╣реИред рд╕рднреА рд▓реЗрдирджреЗрди рдирд┐рд░рдВрддрд░ рд╕рдордп рдХреЗ рд▓рд┐рдП (рдкрд░рд┐рд╢реЛрдзрди) рдХреЗ рд▓рд┐рдП рдорд╣рд╕реВрд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдмреЗрд╣рддрд░ рд░реВрдк рд╕реЗ рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЬрд▓реНрджреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдпрд╛ рдЙрдкрдпреЛрдЧреА рдерд╛ред

рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдврд╝рдиреЗ


рдЗрдХрд╛рдИ-рдШрдЯрдХ-рдкреНрд░рдгрд╛рд▓реА рдкреИрдЯрд░реНрди рдХреЗ рдЕрдзрд┐рдХ рдЧрд╣рди рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕рдВрд╕рд╛рдзрди рд╣реИрдВ:

Source: https://habr.com/ru/post/hi459288/


All Articles