Estoy estudiando una pequeña parte de mi motor de juego y preguntándome cómo optimizar algunas partes.Estructura de datos bidireccionales para esta situación
La situación es bastante simple y es la siguiente:
- Tengo un mapa de
Tile
s (almacenados en una matriz bidimensional) (~ azulejos 260k, pero supongo que muchos más) - tengo una lista de
Item
s que siempre están en al menos ya lo sumo un azulejo - un
Tile
puede contener lógicamente cantidad infinita deItem
s - Durante la ejecución del juego muchos
Item
s son continuas Ly creado y comienzan a partir de su propiaTile
- Cada
Item
cambia continuamente suTile
a uno de los vecinos (arriba, derecha, abajo, izquierda)
Hasta ahora cada Item
tiene una referencia a su real Tile
y solo guardo una lista de artículos. Cada vez que un Item
se mueve a un mosaico adyacente, simplemente actualizo item->tile = ..
y estoy bien. Esto funciona bien, pero es unidireccional.
Al extender el motor me di cuenta de que tenía que encontrar todos los elementos contenidos en un mosaico muchas veces y esto degradaba el rendimiento (especialmente en algunas situaciones en las que tengo que encontrar todos los elementos para un rango de mosaicos, uno a uno).
Esto significa Me gustaría encontrar una estructura de datos adecuada para encontrar todos los elementos de una específica Tile
mejor que en O (n), pero me gustaría evitar gran parte de arriba en el "pasar de una baldosa para otra "fase (ahora solo asigna un puntero, me gustaría evitar hacer muchas operaciones allí, ya que es bastante frecuente).
Estoy pensando en una estructura de datos personalizada para explotar el hecho de que los elementos siempre se mueven a la celda vecina, pero actualmente estoy buscando a tientas en la oscuridad. Cualquier consejo sería apreciado, incluso enfoques engañosos o crípticos. Lamentablemente, no puedo simplemente desperdiciar memoria, por lo que es necesario un buen intercambio.
Lo estoy desarrollando en C++ con STL pero sin Boost. (Sí, lo sé sobre multimap
, no me satisface, pero lo intentaré si no encuentro nada mejor)
El mapa 'Tile' ya es un puntero bidimensional en bruto, ej. 'Mapa de mosaico [ANCHO] [ALTURA]', así que tengo acceso aleatorio a todo el mapa, pero no quiero tener una lista de elementos para cada tesela, ya que estos elementos son escasos y no ocupan una gran zona del mapa. mapa en sí ... – Jack
Eso suena como un mal diseño. Primero, deshazte de las matrices de tamaño fijo, y utiliza un vector con una interfaz adecuada, en segundo lugar haz que 'Tile' sea sus elementos dándole vector o lo que sea localmente. – 111111
No es un mal diseño, el mapa es necesario para todo el mundo. Cada ficha debe existir no por el elemento sino por muchas otras cosas. Como dije, esto es solo una pequeña parte del motor :) – Jack