Motor de batallas v3.1

Todas las Noticias/Anuncios importantes sobre el Juego.
Responder
asturcon3
Site Admin
Site Admin
Mensajes: 6211
Registrado: 12 Nov 2007 14:36
Alianza: aSACo, ofcourse

Motor de batallas v3.1

Mensaje por asturcon3 »

Bueno, 8 meses han pasado desde que puse operativa la version del 'batallador' que ha movido las flotas este tiempo. Aunque ha habido que irle tocando algunas cosas, el resultado no ha estado nada mal :)

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:
  1. 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.
  2. 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...
Quiza por eso al principio de crear unifriki puse que seria temporal... luego me convencisteis de que lo dejara ahi, malditos xD

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.)
Aunque seis minutos y medio aun es demasiado, es mucho mejor que hora y media larga. De hecho, los 450M de memoria que hacen falta para esta batalla ya casi caben en la memoria libre. Esto reducira mucho la carga del sistema.

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 :)
Imagen
asturcon3
Site Admin
Site Admin
Mensajes: 6211
Registrado: 12 Nov 2007 14:36
Alianza: aSACo, ofcourse

Re: Motor de batallas v3.1

Mensaje por asturcon3 »

asturcon3 escribió:
  • 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
Nueva versión: <1M 2 seg

Bueno, pues he terminado las pruebas y parecen satisfactorias. El nuevo motor de batallas tiene un buen número de cambios internos y ha sido muy reorganizado internamente. A día de hoy, no se parece a ninguno que haya visto antes.

Pero vaya, que lo que he hecho se resume en mantener agrupadas en memoria las naves que no han sido tocadas, y las que han muerto. Y tras cada ronda, las naves que han recibido un disparo pero no afectaba al casco (solo al escudo) se vuelven a reagrupar. Dicho así parece fácil, pero implementarlo manteniendo la rapidez ha sido un infierno.

El comportamiento debería ser muy semejante al funcionamiento anterior, que a su vez era idéntico al de speedsim/ogame. Quizá haya alguna diferencia porque el orden en que las naves disparan, depende de cómo vaya la batalla, podría ser distinto. Pero por las pruebas que he hecho parece que eso tiene muy poquita importancia.

Aparte de reproducir las batallas top hechas hasta ahora, en las pruebas he hecho alguna salvajada. Por ejemplo:
Informe de batalla en 4:48:12 (D:76835482000, A:93752704000)

Atacante Alguien

Nave pequeña de carga 679.083 perdió 679.077
Nave grande de carga 210.354 perdió 209.652
Cazador ligero 9.586.296 perdió 9.586.090
Cazador pesado 80.080 perdió 79.953
Crucero 1.431.059 perdió 1.245.165
Nave de batalla 126.608 perdió 20.936
Colonizador 1.211 perdió 735
Reciclador 471.197 perdió 467.275
Bombardero 171.383 perdió 17.493
Destructor 453.202 perdió 8.929
Estrella de la muerte 1.270 perdió 0
Acorazado 90.051 perdió 10.318

Defensor asturcon3

Nave pequeña de carga 3.875 perdió 3.871
Nave grande de carga 33.217 perdió 33.187
Reciclador 1 perdió 1
Sonda de espionaje 109 perdió 109
Estrella de la muerte 2 perdió 0
Lanzamisiles 129.459 perdió 129.391
Láser pequeño 29.034.783 perdió 29.019.770
Láser grande 414.821 perdió 414.477
Cañón Gauss 88.044 perdió 87.215
Cañón iónico 42.039 perdió 41.944
Cañón de plasma 95.785 perdió 86.490
Cúpula pequeña de protección 1 perdió 1
Cúpula grande de protección 1 perdió 0

El combate termina en empate.
El atacante ha perdido 93.752.704.000 unidades.
El defensor ha perdido 76.835.482.000 unidades.
En estas coordenadas flotan ahora 19.292.366.400 Metal y 7.762.530.900 Cristal.

Rentabilidad atacante: -71%
Atacante con/sin reciclaje: -66.697.806.700/-93.752.704.000

Rentabilidad defensor: -65%
Defensor si recicla: -49.780.584.700
Ojo a los 9M y medio de ligeros, y a los 29M de lásers. Esta batalla hasta ahora no se podría ejecutar ni de broma. Con el motor tal como queda, ha requerido 450M de RAM para ejecutarse en 96 segundos.

Así que... juego preparado para que sigais subiendo naves como locos.

Los primeros ataques fijaros bien en el informe, y si veis algo raro a la parte de bugs, que andaré atento :)
Imagen
asturcon3
Site Admin
Site Admin
Mensajes: 6211
Registrado: 12 Nov 2007 14:36
Alianza: aSACo, ofcourse

Re: Motor de batallas v3.1

Mensaje por asturcon3 »

Por cierto, puntualizo: Ataques como el de arriba son el peor caso posible, muchas naves en ambos bandos. Cuanto más desequilibrados estén los bandos (muchas más naves en un lado que en el otro) menos memoria y tiempo serán necesarios para procesar las batallas. Y lo normal cuando alguien se decide a atacar es que lo haga con mucha ventaja, para sacar renta.

Lo que tumbó el server la semana pasada, ahora lo puedo decir, eran las batallas de sonda contra bunker, cuando se detectaba un espionaje. Aunque esas son batallas muy tontas, el caso es que el programa tenía que montar todo el tinglado de una batalla y ejecutarla, y eso se le comía los recursos. Quien quiera probar en el speedsim 1 sonda contra 9M de lanzamisiles podrá ver el efecto. Bueno... esto no volvera a pasar por grande que sea el bunker :)
Imagen
asturcon3
Site Admin
Site Admin
Mensajes: 6211
Registrado: 12 Nov 2007 14:36
Alianza: aSACo, ofcourse

Re: Motor de batallas v3.1

Mensaje por asturcon3 »

Las flotas siguen creciendo, y el motor acaba de terminar de 'sufrir' unos retoques. Principalmente, que la politica de agrupacion de naves intactas y naves muertas ahora se ha extendido, de forma que siempre se intentan agrupar naves por (flota/tipo/escudo/casco), incluso estando vivas pero tocadas. ¿No sabes que significa? bue, creo que yo tampoco xD

El caso es que la batalla Marto vs G0l0 (unos 40M de naves) que tumbo el servidor y me hizo ponerme con esto ahora se ejecuta en 70 segundos usando unos 250MB de memoria. Chachi. Hay margen. Lo que dolia no era el numero de naves, sino que la batalla fuera equilibrada (empate). En batallas desequilibradas es mas facil pq las naves mueren mas rapido.

De paso he tocado algunos limites internos:
El numero de naves del mismo tipo dentro de una flota tiene un limite de 4G
El numero de flotas en una batalla, 256

Y aunque esto no se ve en el juego, lo escribo y aviso por si me he cargado algo y veis cosas raras, que me aviseis :)
Imagen
asturcon3
Site Admin
Site Admin
Mensajes: 6211
Registrado: 12 Nov 2007 14:36
Alianza: aSACo, ofcourse

Re: Motor de batallas v3.1

Mensaje por asturcon3 »

Tiempo sin tocar esto.

Ayer se introdujo una modificación para soportar naves suicidas (la mina orbital)

Hoy he metido una aproximación en batallas grandes, para limitar los estragos que puede hacer en el servidor alguna batalla gigantescamente enorme, normalmente causada por algún universo extraño.
La limitación es simple de entender: Si en la batalla hay más de 5M de naves atacantes y 5M de naves defensoras, se divide la batalla entre dos y se vuelve a comprobar.

Así, una batalla de 100M de naves contras 20M de naves quedaría como:
100+20
/2=50+10
/2=25+5

De forma que la batalla que se calcula es la cuarta parte de la original y luego el resultado (escombros, pérdidas, naves muertas, capturas, etc) se multiplica por 4 para obtener el resultado, y se ajusta de varios modos para mejorar la aproximación.

Evidentemente el resultado no es exacto, pero por las pruebas que he hecho el error se mueve en el entorno del 2 ó 3% enlos peores casos. Que le den. La mayor batalla de anoche se calculó en 83 minutos y aunque no se va a repetir porque el uni estaba bugueado y lo he borrado, el caso es que esta aproximación divide la batalla entre 64 y deja el tiempo de cálculo en un minuto.

Aclarar que en batallas menores que los límites indicados, este cambio no se activa y por tanto se ejecutan como siempre.

Ale :)
Imagen
asturcon3
Site Admin
Site Admin
Mensajes: 6211
Registrado: 12 Nov 2007 14:36
Alianza: aSACo, ofcourse

Re: Motor de batallas v3.1

Mensaje por asturcon3 »

Acabo de introducir una modificación por la que batallas en las que participan más de 2100M de naves se ejecutan correctamente.

Esto era un límite interno motivado por el uso de una variable de 32 bits que se quedaba corta, cosa que se ha detectado al revisar una caída del motor esta noche. El motor se reactivó, pero tras hacer el loco durante unas horas durante las cuales las flotas estuvieron detenidas.
Imagen
Responder