Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Eskema en Junio 25, 2018, 04:52:37 PM

Título: Duda implementando IA con commanders
Publicado por: Eskema en Junio 25, 2018, 04:52:37 PM
Buenas,
 
 
 
Estaba repasando cosillas y mirando a ver como implementar la IA por reducir el stress del sistema y aumentar el rendimiento y me acorde de los commanders (tradicionalmente implementados en GOAP), queria preguntaros si alguno ha implementado esa tecnica para reducir la sobrecarga del sistema.
 
En mi juego voy a tener 100 enemigos en pantalla, tener 100 enemigos calculando pathfind hacia el personaje, mas calcular acciones (IA sobre FSM), es como se suele pensar "costoso", vale que no todas las acciones son cada frame, pero calcular pathfinding no es barato, ni tampoco los raycasts para el line of sight.
 
Asi que aqui entra la figura del commander, juntar a los enemigos en paquetes de N enemigos (pongamos 5) y que sea una sola persona las que los controla (el commander), que es quien solicita el pathfind, o chequea la logica para decidir la accion, con lo cual pasamos de 100 enemigos a 20 solo, con la consiguiente mejora de rendimiento.
 
Pero no se si tal vez no es calentarse mucho la cabeza, o si el commander tiene alguna pega que desconozco.
Título: Duda implementando IA con commanders
Publicado por: hammer en Junio 25, 2018, 08:30:57 PM
Oh!! podrias utilizar el nuevo tandem jobs + ECS parece ideal para estos casos,i dont tested yet.Luego se me ocurre,depende del tipo de juego claro como siempre, podrias generar en el nivel algun octree(o simplemente un grid) de triggers, cuando un enemigo entre en algun trigger lo seteas como su commander.Entonces pues no se podrias hacer que los enemigos que esten en algun nodo vecino a el nodo que contenga al player calculen su propio path y sus cosas individualmente,mientras que los que esten en nodos mas lejanos calcular 1 path desde el nodo y pasarselo a los enemigos que contengan,o si estan muy lejos que no hagan nada.No se, si es un octree aun puedes ir despiezando mas los calculos segun la profundidad de este.Empiezas en la primera subdivision y segun vas bajando en el octree vas haciendo calculos,y vas viendo en que nodos hace falta bajar mas y hacer mas calculos.Seria como un arbol de commanders ;D,cada commander manda sobre sus commanders hijos,y el ultimo commander que calcule algo que mande sobre las unidades,como una jerarquia de mando,donde cada commander va delegando a sus descendientes como si fuera por quadrantes :D
 
El problema de commanders sueltos ,me parece, es que tendrias que estar controlando de ir metiendo a las unidades en su commander correspondiente,si se aleja una unidad por ejemplo,sacarla de uno y metarla en otro con otro grupo o dejarla sola,no se me parece lioso.
 
Otra cosa que suelo hacer,muy tipica seguro, es pares/impares, algunos enemigos hacen sus calculos de estado en los frames pares,y el resto en los impares.
 
Dolor de cabeza seguro que es :D, pero ahorraras bastante seguro, depende del tipo de juego claro.Lo he escrito asi pensando,no se si te encajara en lo que necesitas :D,pero alomejor te sirve para amasar algo interesante,ya nos cuentas que estos temas siempre interesan.
 
Beers!!!
Título: Duda implementando IA con commanders
Publicado por: Eskema en Junio 26, 2018, 08:29:53 AM
Lo del octree lo estuve mirando pero con mi gameplay se sale un poco de madre. El tema de usar la tecnica de los commanders es porque las unidades van en grupos de N, y esos grupos no se separan ni se disuelven (por ejemplo como en el juego company of heroes), con lo cual al spawnear las unidades parece optimo meter un commander y que sea quien gestione a esas unidades.
 
Lo malo es que quien calcula es el centro del equipo, y luego hay que afinar el camino modificando a los que estan mas alejados para que no acaben todos caminando en fila india, con lo cual se pierde un poco de la ganancia deseada.
 
Lo tipico de estas cosas que hasta que no te pones a implementar no ves los fallos o las mejoras :)
 
 
Título: Duda implementando IA con commanders
Publicado por: hammer en Junio 27, 2018, 11:14:29 AM
Pues he estado mirando videos y por como rodean algunos obstaculos ,unidades del mismo commander unas por la izquierda y las otras por la derecha para esquivar un coche,no parece que se libren de tener que calcular los path de las unidades.
 
Solo se me ocurre que al commander se le pasa la posicion deseada, el commander supongo hara un sphereCast de cierto radio para detectar los objetos cercanos,coberturas y tal,entonces segun los elementos que tenga en un radio de la posicion deseada el commander le pasa a las unidades las posiciones a las que tienen que ir cada una y estas se calculan su path.Si calculas los path en un job aparte para que no te saturen el hilo principal no creo que hubiera problemas de rendimiento por esta parte,tambien podrias ir metiendo solicitudes de calculo de path en alguna pool para asegurarte que no se calculan 100 en un mismo frame aunque seria mucha casualidad que todas las unidades calcularan el path a la vez.
 
Luego a las unidades les meteria un sphere trigger para que mientras recorren el path detecten ciertos elementos, compañeros por ejemplo para frenar un poco y que lo deje pasar,estos harian una llamada al commander y este decidiria cual frena teniendo en cuenta quien esta mas cerca del final del path para dejarlo pasar,o por si se cruzan una cobertura media o obstaculo pequeño que lo saltaran.
 
Si no solo quedaria coger algun tipo de offset desde la posicion del commander para cada unidad y que lo intentara mantener mientras recorren el unico path, con un sphere para detectar obstaculos y en tal caso hacer que vaya recortando el offset del el path calculado hasta que no encuentre el obstaculo.
 
Esto es como el all-i-oli XD,decirlo parece facil, a la que te pones te das cuenta de que no y que se ha cortado XD
Título: Duda implementando IA con commanders
Publicado por: Eskema en Junio 27, 2018, 11:27:53 AM
Esto es como todo, tiene su truco. Tu te encargas de que el commander (que no se ve ni existe como tal) este en el centro del grupo y le calculas el camino al destino, el resto de unidades siguen al commander (mueves el commander que no existe y las unidades hacen un follow transform de toda la vida), y aplicando steering a las unidades te encargas de que no choquen y esquiven obstaculos, bien sea como dices con un sphere cast u otro metodo (aplicado SOLO al commander claro).
 
De esta forma asumiendo que las 100 unidades en pantalla se tengan que mover, y asumiendo que por ejemplo las dividamos en grupos de 10, eso nos deja solo 10 commanders haciendo pathfind, mientras que los "hijos" se limitan a hacer steering mientras siguen al padre al destino.
 
Cuando lo tenga terminado ya comentare si el curro ha valido la pena o no, de momento la cosa promete funcionar razonablemente bien y con un performance aceptable