Hola Habr! Les presento la traducción del artículo "ECS de ida y vuelta - Parte 1 - Introducción" de Michele skypjack Caini .
ECS de ida y vuelta
Parte 1 - Introducción.
Cuando supe por primera vez sobre el sistema de componentes de entidad de entidad de plantilla arquitectónica, fui a buscar más información al respecto en Internet. Pero, desafortunadamente, entonces no se arrojó suficiente luz sobre este tema, y no hubo recursos donde se describieran diferentes enfoques con sus pros y sus contras. Casi todos los artículos, publicaciones y comentarios (una proporción significativa de ellos) se referían a una implementación específica y solo se referían ligeramente a otros ejemplos.
En esta publicación, intentaré ponerte al día y descubrir algunos modelos introductorios para ti, dando algunos consejos para que puedas hacer tu propio ECS.
¿Por qué debería usar ECS?
Trate de no dejarse engañar por lo que dicen a su alrededor. Si está trabajando en proyectos AAA a un nivel serio, la razón principal por la que debe usar una herramienta tan seria es la organización del código, y no (solo) el rendimiento. Por supuesto, el rendimiento no es lo último, pero una base de código bien organizada no tiene precio, y con la mayoría de los juegos no tendrás problemas de rendimiento, ya sea que se escriban utilizando el paradigma OPP o con otra implementación opcional de la plantilla del componente.
En esencia, la programación orientada a componentes es una herramienta extremadamente poderosa que le permite hacer que el código sea fácilmente extensible y acelerar el ciclo de desarrollo. Sin lugar a dudas, todo esto debería ser su objetivo principal.
, . , , .
, .
, . () . , , , , . : .
, . , , , .
, , , . , , .
?
( ), update . , , , .
, . . , , . , .
, , - .
ECS back and forth
ECS.
, , .
«Game Programing Patterns». -.
, ECS , .
, , .
- . , , . , . , .
– . .
. , — . , .
, , , , -. - , , . , - . , , , - .
– family generator. , . , : entityx and EnTT.
family generator.
class family {
static std::size_t identifier() noexcept {
static std::size_t value = 0;
return value++;
}
public:
template<typename>
static std::size_t type() noexcept {
static const std::size_t value = identifier();
return value;
}
};
:
const auto id = family::type<my_type>();
. . , , .
family generator . , , , .
:
- ( ) . – ECS, , , - .
, , - , .
?
, , . , , . bitset .
, , . family generator , . .
, — . , , , . :
void my_nth_system(std::vector<game_objects> &objects) {
for(auto &&object: objects) {
if(object.has<position, velocity>()) {
auto &pos = object.get<position>();
auto &vel = object.get<velocity>();
}
}
}
, : , . , , .
. , . , : , , .
. , , , . , , , , , . , . , , .
, – . ? . , . , ? , - , .
: —
– .
. , . . , . .
, , - , — :). , . 0, – 1, . , , 0, 1.
? , , , 0 0, 1 1, . , N M , .
. , , . , . - , entityx, ECS C++.
bitset . . , C N > 0. C , N . C 0, . ? Bitsets – .
, , , bitsets .
, , . , , , , , -, . , : - - , , . , , , , , . bitset , .
?
, . , , , , , .
, . , , , , .
,
, , .
, , GitHub , . , .
.