Individuazione di percorsi e prevenzione delle collisioni su dispositivi mobili


8

Attualmente sto sviluppando un gioco simile a Diablo per piattaforma mobile (iphone5 +).

Una semplice ricerca A * troverà il percorso, ma deve ancora essere presa in considerazione la prevenzione delle collisioni.

Ci saranno circa 50 mostri attivi contemporaneamente, quindi le prestazioni sono molto importanti.

Ho trovato alcuni metodi che potrebbero funzionare.

  1. NavMesh + RVO

    La libreria di rifusione / deviazione funziona bene sulla pathfindingparte, ma la simulazione della folla raggiunge rapidamente il limite (oltre 5 ms per 30 agenti).

    Un'altra libreria RVO2 sembra a posto (meno di 2 ms per 50 agenti), ma la libreria presenta alcuni problemi di licenza.

  2. Campi di flusso + motore fisico

    Molti giochi RTS usano questo metodo, ma sembra che sia necessario un motore fisico per risolvere le collisioni. Se molti agenti non condividono un obiettivo comune, questo metodo potrebbe costare di più rispetto al tradizionale percorso A *.

  3. Comportamenti dello sterzo + motore fisico

    I comportamenti dello sterzo includono molti concetti, penso che simple avoidance behaviorpotrebbero funzionare (basta girare a sinistra / destra se c'è qualcosa di fronte), ma il metodo richiede ancora un motore fisico per lavorare insieme.

Non sono ancora sicuro di quale utilizzare, forse esistono altri metodi di prevenzione dei percorsi e di prevenzione delle collisioni.

PS Halo:Spartan Strikeusa Havok AI (basato su RVO?), Ma non ho visto molti nemici in quel gioco, quindi mi chiedo se il primo metodo (NavMesh + RVO) funzionerà bene su piattaforma mobile.


La tua GPU ha più di 50 unità di elaborazione, quindi eseguire A-star sulla GPU per ogni mostro dovrebbe eseguire juss più velocemente di una normale CPU per un agente.
Pieter Geerkens,

@PieterGeerkens La parte di rilevamento dei percorsi ora funziona correttamente su dispositivi mobili (meno di 0,1 ms per richiesta), ma la parte di prevenzione delle collisioni no. Inoltre, abbiamo molte attività di rendering, quindi immagino che la GPU non avrà tempo libero per evitare le collisioni.
lostyzd,

Risposte:


4

Questa è una domanda piuttosto interessante e cercherò di contribuire con ciò che posso.

In primo luogo, penso che tu debba definire chiaramente i confini del gioco che stai cercando di creare e definire quelle domande (alcune potrebbero già aver ricevuto risposta).

  • Quanto dista l'aggro mostro?
  • Quanti mostri allo stesso tempo è il tuo bersaglio?
  • Come è organizzato il tuo terreno? È piastrellato?
  • Quanto vuoi evitare le collisioni?

Per citare una risposta da qui su come viene eseguita la ricerca dei percorsi in Starcraft 2:

Starcraft II utilizza una triangolazione di Delaunay vincolata del terreno della mappa e degli edifici per produrre una maglia; Un * con un filtro a imbuto viene utilizzato per il percorso lungo questa mesh, tenendo conto dei raggi unitari; quindi vengono aggiunti gli strati locali di sterzata e prevenzione delle collisioni, tra cui una funzione cooperativa "spingi le unità inattive fuori strada" in cui è possibile spostare un'unità invece di percorrerla attorno in determinati casi. Inoltre, le unità che si muovono in parallelo vengono ignorate ai fini della prevenzione delle collisioni poiché possono essere garantite per non influenzarsi a vicenda; [...] SC2 utilizza sei forze di governo: seguire, affollamento, raggruppamento, separazione, evitamento e arrivo.

Quindi tornando alle tue 3 proposizioni:

  1. NavMesh + RVO -> Se ci sono problemi di licenza, allora non è un'opzione. Potrebbe essere l'implementazione più semplice però.
  2. Flow Fields + Physics Engine -> Dipende onestamente, ma sembra davvero intensivo in un ambiente semi-dinamico come quello che vuoi
  3. Comportamenti dello sterzo + motore fisico -> Il comportamento dello sterzo mi sembra la strada da percorrere. In questo modo è possibile definire alcuni comportamenti floccati piuttosto belli per il tuo gioco, a seconda del tipo di mostro. E si ridimensiona bene con il numero di mob. Tuttavia, starei lontano dalla fisica per il rilevamento delle collisioni. È sufficiente un semplice comportamento di elusione, riducendo la velocità o aumentando, girando, ecc.

Alcune note sui comportamenti dello sterzo, puoi definire tutte le forze di sterzo di cui hai bisogno, con le aree che desideri. Hai bisogno di almeno 3, per floccaggio / attrazione / repulsione, ma probabilmente altri sono interessanti.

Quindi, prova a trovare una libreria che faccia i comportamenti di guida per vedere se si adatta alle tue esigenze (come questo ? Non ne conosco davvero nessuno, ma esiste).

Se la libreria non soddisfa le tue esigenze, allora sei pronto per divertirti! Ma ci sono abbastanza risorse e algoritmi per implementare da soli i comportamenti di floccaggio. Esempio 1 Esempio 2

Se scegli di implementare te stesso, sappi che ci sono alcune buone ottimizzazioni da fare, poiché l'ambito del tuo agente viene ridotto ad esempio dalla sua posizione nel gregge. Dovrebbe comunque essere incluso in alcuni degli algoritmi.

Beh, questo è il meglio delle mie conoscenze, non sono sicuro comunque


Grazie per aver risposto. Il comportamento dello sterzo funziona bene in una scena densa? Le demo in questo tutorial hanno molte collisioni e oscillazioni.
lostyzd,

1

Se i percorsi nemici non sono molto dinamici (dinamico sarebbe che ogni coppia di agenti sta attaccando obiettivi diversi e i percorsi verso tali obiettivi devono essere aggiornati ogni coppia di frame)

Quindi farei una combinazione di campi di flusso e comportamenti di guida se le prestazioni sono la tua principale preoccupazione. Ci sono alcuni argomenti più complicati coinvolti come il partizionamento dello spazio dei tuoi agenti, quindi trovare i vicini è più facile ma è la soluzione migliore per le prestazioni. (rimuovendo la tua ricerca A * e usando i campi di flusso per dirigere i tuoi agenti)

Questi due algoritmi combinati sono generalmente considerati la soluzione più ottimizzata per scene dense di agenti con un percorso non molto dinamico.

Eviterei la fisica, non importa la tua ultima opzione in quanto può diventare pesante.

La collisione tra agenti può essere gestita quasi interamente da comportamenti di guida e campi di flusso riducono il peso di 50 agenti che calcolano i percorsi. Tieni presente, tuttavia, che i campi di flusso diventano sempre più costosi quanto più grande è la dimensione della mappa, più piccola è la dimensione della griglia e più dinamica deve essere la selezione del bersaglio.


Mi piace l'idea dei campi di flusso. Ma per quanto ne so, sia Planetary Annihilation che Starcraft usano la fisica per evitare la collisione, quindi non sono sicuro che il campo di flusso possa essere eseguito senza il sistema di fisica.
lostyzd,

Possono, tutto ciò che devi fare è creare un comportamento di governo del campo di flusso. La sua unica funzione è quella di verificare la posizione della griglia corrente per il suo vettore di flusso. Tutto ciò che fa un campo di flusso è dirigere i tuoi agenti, gli altri comportamenti di guida si occupano della collisione.
Saevax,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.