Pathfinding y evitar colisiones en dispositivos móviles

8

Actualmente estoy desarrollando un juego similar a Diablo para plataforma móvil (iphone5 +).

Una simple búsqueda A * encontrará el camino, pero aún debe tenerse en cuenta la prevención de colisiones.

Habrá alrededor de 50 monstruos activos al mismo tiempo, por lo que el rendimiento es muy importante.

Encontré algunos métodos que podrían funcionar.

  1. NavMesh + RVO

    La biblioteca de refundición / desvío funciona bien por pathfindingparte, pero su simulación de multitudes alcanza rápidamente el límite (más de 5 ms para 30 agentes).

    Otra biblioteca RVO2 parece estar bien (menos de 2 ms para 50 agentes), pero la biblioteca tiene algunos problemas de licencia.

  2. Campos de flujo + motor de física

    Muchos juegos de RTS usan este método, pero parece que se requiere un motor de física para resolver las colisiones. Si muchos agentes no comparten un objetivo común, este método podría costar más que la ruta tradicional A *.

  3. Comportamientos de dirección + motor de física

    Steering Behaviors incluye muchos conceptos, creo que simple avoidance behaviorpodrían funcionar (solo gire a la izquierda / derecha si hay algo al frente), pero el método aún requiere un motor de física para trabajar juntos.

Todavía no estoy seguro de cuál usar, tal vez existan otros métodos para encontrar caminos y evitar colisiones.

PS Halo:Spartan Strikeusa Havok AI (¿basado en RVO?), Pero no vi muchos enemigos en ese juego, así que me pregunto si el primer método (NavMesh + RVO) funcionará bien en la plataforma móvil.

lostyzd
fuente
Su GPU tiene más de 50 unidades de procesamiento, por lo que ejecutar A-star en la GPU para cada monstruo debería funcionar tan rápido como en una CPU normal para un agente.
Pieter Geerkens
@PieterGeerkens La parte de búsqueda de ruta funciona bien ahora en dispositivos móviles (menos de 0.1 ms por solicitud), pero la parte de prevención de colisiones no. También tenemos muchas tareas de renderizado, así que supongo que la GPU no tendrá tiempo libre para evitar colisiones.
lostyzd

Respuestas:

4

Esta es una pregunta bastante interesante, y voy a tratar de contribuir con lo que pueda.

Primero, creo que tienes que definir claramente los límites para el juego que estás tratando de crear y definir esas preguntas (algunas ya pueden haber sido respondidas).

  • ¿Qué tan lejos está el monstruo aggro?
  • ¿Cuántos monstruos al mismo tiempo es tu objetivo?
  • ¿Cómo está organizado tu terreno? ¿Está alicatado?
  • ¿Cuánta evitación de colisiones quieres?

Para citar una respuesta de aquí sobre cómo se realiza la búsqueda de rutas en Starcraft 2:

Starcraft II utiliza una triangulación de Delaunay restringida del terreno y edificios del mapa para producir una malla de navegación; Se utiliza un * con un filtro de embudo para recorrer esta malla, teniendo en cuenta los radios de la unidad; luego se agregan capas de dirección local y de prevención de colisiones además de eso, incluida una característica cooperativa de "empujar las unidades inactivas fuera del camino" donde es posible desplazar una unidad en lugar de recorrerla en ciertos casos. Además, las unidades que se mueven en paralelo se ignoran para evitar colisiones, ya que se puede garantizar que no se afectan entre sí; [...] SC2 utiliza seis fuerzas de dirección: seguimiento, agrupación, agrupación, separación, evasión y llegada.

Volviendo a sus 3 proposiciones:

  1. NavMesh + RVO -> Si hay problemas de licencia, entonces no es una opción. Sin embargo, podría ser la implementación más fácil.
  2. Flow Fields + Physics Engine -> Depende honestamente, pero parece realmente intensivo en cómputo en un entorno semi dinámico como lo que quieres
  3. Comportamientos de dirección + Motor de física -> El comportamiento de dirección me parece el camino a seguir. De esa forma, puedes definir algunos comportamientos de bandada bastante agradables para tu juego, dependiendo, por ejemplo, del tipo de monstruo. Y se adapta bien al número de la mafia. Sin embargo, me mantendría alejado de la física para la detección de colisiones. Un comportamiento de evitación simple es suficiente, reduciendo la velocidad o aumentando, girando, etc.

En algunas notas sobre los comportamientos de dirección, puede definir tantas fuerzas de dirección como necesite, con las áreas que desee. Necesita al menos 3, para el congregación / atracción / repulsión, pero probablemente haya más interesantes.

Luego, trate de encontrar una biblioteca que controle los comportamientos para ver si se ajusta a sus necesidades ( ¿de esta manera ? Realmente no conozco ninguna, pero existe).

Si la biblioteca no se ajusta a tus necesidades, ¡estás listo para divertirte! Pero hay suficientes recursos y algoritmos para implementar comportamientos de congregación usted mismo. Ejemplo 1 Ejemplo 2

Si elige implementarse usted mismo, sepa que hay una buena optimización por hacer, ya que el alcance de su agente se reduce, por ejemplo, por su ubicación en el lote. De todos modos, debe incluirse en algunos de los algoritmos.

Bueno, eso es lo mejor de mi conocimiento, de todos modos no estoy seguro

Bluk
fuente
Gracias por responder. ¿Funcionará bien el comportamiento de dirección en una escena densa? Las demostraciones en este tutorial tienen muchas colisiones y oscilaciones.
lostyzd
1

Si las rutas enemigas no son muy dinámicas (Dinámica sería cada pareja de agentes están atacando diferentes objetivos y las rutas a esos objetivos deben actualizarse cada dos cuadros)

Entonces haría una combinación de campos de flujo y comportamientos de dirección si el rendimiento es su principal preocupación. Hay algunos temas más complicados involucrados, como la división en el espacio de sus agentes, por lo que encontrar vecinos es más fácil, pero es su mejor apuesta para el rendimiento. (eliminando su búsqueda A * y usando campos de flujo para dirigir a sus agentes)

Esos dos algoritmos combinados generalmente se consideran la solución más optimizada para escenas densas de agente con poca ruta dinámica.

Evitaría la física sin importar su opción final, ya que puede volverse pesada.

La colisión entre agentes puede manejarse casi por completo mediante comportamientos de dirección y los campos de flujo reducen el peso de 50 agentes que calculan rutas. Sin embargo, tenga en cuenta que los campos de flujo se vuelven cada vez más caros cuanto mayor sea el tamaño de su mapa, y más pequeño el tamaño de su cuadrícula, y más dinámica debe ser su selección de objetivos.

Saevax
fuente
Me gusta la idea de los campos de flujo. Pero hasta donde yo sé, tanto la Aniquilación planetaria como Starcraft usan la física para evitar colisiones, por lo que no estoy seguro de si el campo de flujo se puede hacer sin el sistema de física.
lostyzd
Pueden hacerlo, todo lo que necesita hacer es crear un comportamiento de dirección del campo de flujo. Su única función es verificar su ubicación de cuadrícula actual para su vector de flujo. Todo lo que hace un campo de flujo es dirigir a sus agentes, los otros comportamientos de dirección se encargan de la colisión.
Saevax