En Java (Swing), supongo que tengo un juego en 2D en el que tengo varios tipos de entidades en la pantalla, como un jugador, tipos malos, mejoras, etc. Cuando el El jugador se mueve a través de la pantalla, para hacer un control eficiente de lo que está en las inmediaciones del jugador, creo que me gustaría tener acceso indexado a las cosas que están cerca del personaje en función de su posición.Mapeo eficiente de posiciones de entidades de juego en Java
Por ejemplo, si los pasos jugador 'P' sobre el elemento 'E' en el siguiente ejemplo ...
| | | | | |
| | | |P| |
| | |E| | |
| | | | | |
... sería hacer algo como:
if(player.getPosition().x == entity.getPosition().x &&
entity.getPosition.y == thing.getPosition().y)
{
//do something
}
Y eso está bien, pero eso implica que las entidades mantienen sus posiciones, y por lo tanto, si tuviera MUCHAS entidades en la pantalla, tendría que recorrer todas las posibles entidades disponibles y verificar la posición de cada una de ellas frente a la posición del jugador. Esto parece realmente ineficiente, especialmente si comienzas a recibir toneladas de entidades.
Así, sospecharía que me gustaría algún tipo de mapa como
Map<Point, Entity> map = new HashMap<Point, Entity>();
y almacenar la información de mi punto de allí, para que pudiera acceder a estas entidades en un tiempo constante. El único problema con ese enfoque es que, si quiero mover una entidad a un punto diferente en la pantalla, tendría que buscar a través de los valores de HashMap para la entidad que quiero mover (ineficiente ya que no sé su Point position before time), y luego una vez que lo encuentre, quítelo de HashMap y vuelva a insertarlo con la nueva información de posición.
¿Alguna sugerencia o consejo sobre qué tipo de estructura de datos/formato de almacenamiento debería utilizar aquí para tener un acceso eficiente a las entidades en función de su posición, así como las posiciones basadas en la entidad?
Gracias por los consejos, voy a investigar particiones de espacio más. –
Escribo dos implementaciones de tablero de juego para contener 1,000,000 de entidades agregadas al azar a un área de 1920x1080. Utilizando una matriz de contenedores de 1080x1920, tuve 0.004 ms para la inserción, 0.003 ms para la eliminación y 0.004 ms para solicitar una lista de todos los contenedores en un área de 3x3. Usando el particionamiento de espacio binario dinámico, tuve insertos de 0.007 ms, eliminaciones de 0.003 ms y consultas de 0.007 ms para particiones que intersectan una región de 3x3. El rendimiento y el uso de la memoria en el BSP deberían ser incluso mejores para las entidades distribuidas de manera no uniforme. – Gunslinger47