2009-08-13 15 views
9

Sto lavorando a un gioco 2D che ha una quantità enorme di entità dinamiche. Per il divertimento, chiamiamoli soldati, e diciamo che ce ne sono 50000 (che ho pensato solo casualmente, potrebbe essere molto più o molto meno :)).Gioco 2D: veloce (est) modo di trovare x entità più vicine per un'altra entità - quantità enorme di entità, altamente dinamico

Tutti questi soldati muovono ogni fotogramma secondo le regole - pensate al boid/al floccaggio/al comportamento dello sterzo. Per ogni soldato, per aggiornare il suo movimento ho bisogno dei soldati X che sono più vicini a quello che sto elaborando.

Quale sarebbe la migliore gerarchia spaziale per archiviarli per facilitare calcoli come questo senza troppe spese generali? (Tutte le entità vengono aggiornate/spostate ogni frame, quindi deve gestire molto bene le entità dinamiche)

+0

non dimenticare di chiudere la domanda selezionando la risposta più utile. – Toad

+0

Ecco [un buon algoritmo] (http://wapedia.mobi/en/Flocking_ (comportamento)), simile al suggerimento di reinier. –

+0

[questo blog] (http://blogs.msdn.com/devdev/) ha [una buona riscrittura di una soluzione] (http://blogs.msdn.com/devdev/archive/2007/06/07/k -nearest-neighbor-spatial-search.aspx) (così come una serie di altre buone articolazioni) – BCS

risposta

11

L'approccio più semplice consiste nell'utilizzare una griglia. Ha diversi vantaggi:

  • semplici
  • veloci
  • facile aggiungere e rimuovere gli oggetti
  • facile cambiare la griglia per un dettaglio più fine, se si sta ancora facendo troppi controlli a distanza

Inoltre, assicurarsi di non eseguire uno squareroot per ogni controllo della distanza. Dal momento che stai solo confrontando le distanze, puoi anche confrontare la distanza al quadrato.

+3

+1 per il consiglio quadrato, sempre bello ricordarlo a – Gnoupi

+3

+1 per la piazza, molte persone non si rendono conto quanto sia estesa la funzione e quanto sia semplice evitarlo;) –

5

Per il rilevamento di collisione in fase ampia, un spatial index come un albero quadrangolare (poiché è 2D) o una griglia. Ho collegato a Metanet Software's tutorial prima; delinea uno schema basato sulla griglia. Naturalmente, il tuo gioco non ha nemmeno bisogno di usare le griglie in modo così approfondito. Basta archiviare ciascun attore in una griglia nascosta e scontrarlo con oggetti nelle stesse celle vicine.

+0

quadtree non è il migliore probabilmente perché per ogni oggetto in movimento, devi rimuoverlo dall'albero e reinserirlo. Un'operazione potenzialmente costosa. O devi ricostruire nuovamente l'albero ogni fotogramma. – Toad

+0

@reinier: Penso che faresti qualche test per capire quanto spesso hai bisogno di aggiornare il quadrifoglio. È sempre possibile rallentare tale velocità e aumentare il raggio degli oggetti per testare le collisioni. Certo, gli oggetti che si muovono velocemente possono comunque volare fuori dal raggio allargato, ma quelli erano quelli problematici in primo luogo. –

+0

stesso argomento va per la griglia; ^) – Toad

0

L'intero punto di selezione di una buona gerarchia spaziale è di essere in grado di selezionare rapidamente solo gli oggetti che devono essere testati. (Una volta scoperto quel piccolo sottoinsieme, la radice quadrata probabilmente non farà più così male)

Mi interessa anche quale sia il metodo migliore/più ottimale per l'indicizzazione spaziale 2D oggetti dinamici.

Quadtree/kd-tree sembrano buoni, ma non sono troppo buoni con inserimenti dinamici. Gli alberi KD possono diventare sbilanciati.

Solo un pensiero casuale, se le tue entità sono punti una doppia struttura di inserimento-ordinamento (da X e Y) in combinazione con una ricerca binaria potrebbe essere qualcosa da provare ..?

+0

se non è necessario, perché usarlo? – Toad