Ahora, como sabeis, se ha quedado chico. Unifriki ha crecido una salvajada, hay batallas en las que participan hasta 35M de naves/defensas y eso no anda. Principalmente por dos temas:
- Memoria: Cada nave/defensa en una batalla se representa por una serie de bytes de memoria. En la version que conoceis, son 6 variables de 32 bits que hacen 24 bytes cada nave. Vaya miseria no? Pues no. 24bytes*35M hacen 840M de memoria, y si le sumamos algunas estructuras mas resulta que el gasto total son 900M. El server tiene mas que eso, pero buena parte esta ocupada ya, asi que los 900M no caben y tienen que irse en parte a disco. Eso es lentisimo.
- CPU: El algoritmo original de batalla hace disparar a todas las naves y luego mira a ver cuantas se han muerto. Esto significa que atacar con una sonda contra un bunker de 30M de defensas hace que se tengan que computar 30M de disparos a la triste sonda de marras. 30M de disparos llevan un rato...
Bueno, el caso. Se inicia campaña de optimizaciones en el motor de batallas, que por ahora contemplan:
- Motor original: 900M 1h30m+
(esto es la RAM y tiempo de proceso para la batalla que os tuvo las flotas paradas y que misteriosamente revivian solas... el server andaba dispando) - Ajuste del tipo de datos de las variables: 450M 1h
(Apurando se reduce la memoria por nave justo a la mitad) - Corte anticipado de disparos : 450M 6m30s
(Segun las naves/def disparan, si matan una nave incrementan una variable. Si la variable navesMuertas se hace igual que la variable NavesDelBando, se cortan los disparos. Esto hace que en mi batalla de muestra el defensor dispare 261 veces en vez de 35M. Si en Opciones se desactivan las batallas compactadas esto se ve claramente: El defensor dispara 261 veces con una fuerza de 4.038.)
Asi que lo acabo de subir y ya esta activo
Tengo pensadas un par de optimizaciones que, sin alterar el resultado, podran hacer que estas batallas sean casi instantaneas y con gasto ridiculo de RAM. Pero requieren bastantes cambios internos y por tanto muchas pruebas antes de ponerlo a andar en el server. Veremos