Si bien estoy de acuerdo con el sentimiento: "no te preocupes por eso a menos que sea un problema probado", creo que vale la pena pensar desde el principio: la solución de adaptación es mucho más dolorosa. Y sí, solo actualizar mosaicos 'cercanos' es el camino a seguir. Pero el almacenamiento y la capacidad de direccionamiento de los elementos en su mundo de juego de manera eficiente es muy importante por razones de rendimiento.
Lo que realmente está pensando aquí es un conjunto de datos disperso: algo donde los índices potenciales son grandes (o ilimitados), pero solo se utiliza una pequeña proporción. El punto clave es que no sabe exactamente qué proporción se utilizará.
La solución estándar para un problema de conjunto de datos disperso es separar el índice / direccionabilidad del almacenamiento de datos real. Entonces, si el objeto de mosaico es costoso, guárdelo en una forma compacta (por ejemplo, una matriz plana). Pero permita que se indexe a través de un objeto más barato. En su forma más simple, puede ser una matriz 2D (o 3D) que puede indexar fácilmente por coordenadas, pero cada elemento de la matriz es simplemente un índice. Luego usa ese índice para buscar el contenido real del mosaico en una matriz separada y compacta. Si el contenido del mosaico aún no existe, agréguelo al final de la matriz y almacene el índice en la matriz 3D.
La solución se vuelve más compleja si desea admitir la eliminación de contenido (ya que conduce a la fragmentación de la matriz de contenido), y si el contenido de su mosaico es barato, entonces el peso adicional del índice (índices de 32 bits o 64 bits) probablemente abrumará los ahorros de no almacenar cada ficha potencial. También es una búsqueda adicional, que dañará el rendimiento de su caché.
Puede obtener aún más eficiencia de almacenamiento al introducir capas adicionales de indirección. Supongamos que organiza sus mosaicos en trozos, y los trozos tienen una granularidad de 64x64x64. Dado un mosaico en 125, 1, 132, sabes que pertenece en trozo (1,0,2). Entonces tienes un mundo, que consiste en una matriz de fragmentos compacta y una matriz de índices de fragmentos (-1 si el fragmento no existe). El contenido de cada fragmento (si está presente) es una matriz de índices de mosaico de 64x64x64 (-1 si el mosaico aún no existe), y una matriz compacta de mosaicos usados. De esta manera, no se quema una gran cantidad de índices de mosaico para fragmentos que nunca se usan. Al seguir este tipo de enfoque y elegir números razonables para la granularidad del fragmento, puede escalar su universo de forma masiva y mantener el uso de la memoria bajo control. En realidad, si haces tus trozos 32x32x32,
También puede hacer trucos furtivos, como usar el bit de orden superior de su trozo o los índices de mosaico para significar algo especial. Entonces, si una entrada en la matriz de mosaico tiene el conjunto de bits superior, entonces los 31 bits inferiores no significan un índice de mosaico, sino que significan un 'índice de deformación' o algo similar, y puede buscarlo en una lista mantenida por separado para averiguar las coordenadas a las que conduce.
¿Por qué no puedes almacenar un millón de fichas en la memoria? Incluso mi teléfono tiene 256 MB de RAM; ¿Qué va a ser un millón de mosaicos vacíos, 4-32 MB?
fuente