Tener listas locales para cada sistema aumentará el uso de memoria para las clases.
Es una compensación tradicional de espacio-tiempo .
Si bien iterar a través de todas las entidades y verificar sus firmas es directo al código, puede volverse ineficiente a medida que crece su número de sistemas: imagine un sistema especializado (que sea una entrada) que busque su entidad de interés probablemente única entre miles de entidades no relacionadas .
Dicho esto, este enfoque aún puede ser lo suficientemente bueno según tus objetivos.
Sin embargo, si le preocupa la velocidad, por supuesto, hay otras soluciones a considerar.
¿Debería cada sistema tener una lista local de entidades que les interesan?
Exactamente. Este es un enfoque estándar que debería brindarle un rendimiento decente y es razonablemente fácil de implementar. La sobrecarga de memoria es insignificante en mi opinión, estamos hablando de almacenar punteros.
Ahora, cómo mantener estas "listas de interés" puede no ser tan obvio. En cuanto al contenedor de datos, std::vector<entity*> targets
la clase interna del sistema es perfectamente suficiente. Ahora lo que hago es esto:
Eliminar una entidad es completamente análogo, con la única diferencia que eliminamos si un sistema coincide con nuestra firma actual (lo que significa que la entidad estaba allí) y no coincide con la nueva firma (lo que significa que la entidad ya no debería estar allí). )
Ahora puede estar considerando el uso de std :: list porque eliminar del vector es O (n), sin mencionar que tendría que cambiar una gran cantidad de datos cada vez que elimine del medio. En realidad, no tiene que hacerlo, ya que no nos importa procesar el pedido en este nivel, solo podemos llamar a std :: remove y vivir con el hecho de que en cada eliminación solo tenemos que realizar O (n) búsqueda de nuestro entidad a ser eliminada.
std :: list le daría O (1) eliminar pero en el otro lado tiene un poco de sobrecarga de memoria adicional. También recuerde que la mayoría de las veces procesará entidades y no las eliminará, y esto seguramente se hace más rápido usando std :: vector.
Si usted es muy crítico con el rendimiento, puede considerar incluso otro patrón de acceso a datos , pero de cualquier manera mantiene algún tipo de "listas de interés". Sin embargo, recuerde que si mantiene su API de Entity System lo suficientemente abstraída, no debería ser un problema mejorar los métodos de procesamiento de entidades de los sistemas si su tasa de fotogramas disminuye debido a ellos, por lo tanto, por ahora, elija el método que le resulte más fácil de codificar. luego perfile y mejore si es necesario.