Ter listas locais para cada sistema aumentará o uso de memória para as classes.
É uma troca tradicional de espaço-tempo .
Embora a iteração por todas as entidades e a verificação de suas assinaturas sejam diretamente codificadas, pode se tornar ineficiente à medida que o número de sistemas cresce - imagine um sistema especializado (que seja uma entrada) que procure sua provavelmente única entidade de interesse entre milhares de entidades não relacionadas .
Dito isto, essa abordagem ainda pode ser boa o suficiente, dependendo de seus objetivos.
Embora, se você estiver preocupado com a velocidade, é claro que existem outras soluções a serem consideradas.
Todo sistema deve conter uma lista local de entidades nas quais está interessado?
Exatamente. Essa é uma abordagem padrão que deve oferecer desempenho decente e é razoavelmente fácil de implementar. A sobrecarga de memória é insignificante na minha opinião - estamos falando sobre o armazenamento de indicadores.
Agora, como manter essas "listas de interesse" pode não ser tão óbvio. Quanto ao contêiner de dados, std::vector<entity*> targets
a classe interna do sistema é perfeitamente suficiente. Agora o que faço é o seguinte:
A remoção de uma entidade é totalmente análoga, com a única diferença que removemos se um sistema corresponder à nossa assinatura atual (o que significa que a entidade estava lá) e não corresponder à nova assinatura (o que significa que a entidade não deve mais estar lá )
Agora você pode considerar o uso de std :: list porque remover do vetor é O (n), sem mencionar que você precisaria mudar grande parte dos dados toda vez que remover do meio. Na verdade, você não precisa - já que não nos preocupamos com o processamento da ordem nesse nível, podemos simplesmente chamar std :: remove e conviver com o fato de que, a cada exclusão, apenas precisamos realizar O (n) pesquisa por nossa entidade a ser removida.
std :: list daria a você remover O (1), mas por outro lado você tem um pouco de sobrecarga de memória adicional. Lembre-se também de que na maioria das vezes você processará entidades e não as removerá - e isso certamente é feito mais rapidamente usando std :: vector.
Se você é muito crítico em termos de desempenho, pode considerar ainda outro padrão de acesso a dados , mas de qualquer forma mantém algum tipo de "lista de interesse". Lembre-se, porém, de que se você mantiver sua API do sistema de entidades abstrata o suficiente, não deverá ser um problema para melhorar os métodos de processamento de entidades dos sistemas se a taxa de quadros cair por causa deles - portanto, por enquanto, escolha o método mais fácil para você codificar - apenas perfil e aprimore, se necessário.