2013-02-25 10 views
8

Questa è più una domanda che richiedere un consiglio su quale modello/approccio dovrei usare. Ho svolto alcune indagini su questo problema - con scarsi risultati.XNA - Neve simulata

In sostanza, ho un'idea per un gioco, in cui la meccanica chiave del gioco si basa sulla neve che cade - o, nel caso di questo gioco di idee - particelle che cadono.

La neve/particelle devono cadere nello schermo, ma si accumulano in pile. Il problema è che ho bisogno di nevicare per "gocciolare" i lati delle pile, quando sono un certo angolo, e continuare ad accumulare. È possibile che i buchi si aprano sotto cumuli di neve e che la neve debba cadere - pensa come la sabbia che cade attraverso una clessidra.

Ho provato questo è Box2d - è chiaro che Box2d non è la scelta giusta per 10.000 di minuscole particelle - che durano per lunghi periodi di tempo. La scatola 2D si è trasformata in morte in fretta.

Ho provato a disegnare 1px bitmap sullo schermo, ma l'elaborazione di 10.000 di collisioni ogni aggiornamento si è dimostrata scadente.

Qualsiasi idea sarebbe apprezzata.

Acclamazioni

+0

Probabilmente finirai con un concorrente di 3dMark ... 10000 di particelle persistenti suonano come un lavoro per CUDA comunque – Alex

+0

puoi chiarire - è 2d o 3d, la neve si accumula solo cadendo dall'alto e che taglia se giochi all'area? – Stuart

+0

Sto realizzando un gioco platform 2d basato su tessere e quando estraggo 200'000 sprite in full hd mi danno 60 fotogrammi al secondo sul desktop mediocre del 2008, quindi non penso che 10'000 sprite dovrebbero essere di preoccupazione. La logica di collisione potrebbe essere imperfetta e dare risultati insoddisfacenti, come ad esempio l'OP potrebbe eseguire controlli tra tutti i fiocchi di neve, quando alcuni di essi sono troppo lontani per poter essere sottoposti a controlli. – user1306322

risposta

1

Beh, proprio come avete scoperto, nessuna libreria esistente vi aiuterà a meno che non sia orientata in modo specifico verso lo scenario. Con XNA sfortunatamente non ci sono molte cose tra cui scegliere, e sembra che nessuna delle esistenti librerie di sistemi di particelle supporti la fisica delle particelle.

Quindi dovrai fare molto lavoro da solo. Prima di tutto è necessario pensare a tutte le ottimizzazioni che si possono fare. Come un commento ha detto, non si dovrebbero eseguire controlli tra tutte le particelle ogni fotogramma. Dovresti usare un controllo di collisione basato su punti invece del roba più elaborato solitamente usato dai motori fisici. Dovresti assicurarti che le particelle abbiano sempre le stesse dimensioni, in questo caso (rispetto a un sistema di coordinate di riferimento cioè, ciò non significa che non potresti avere lo zoom). E ovviamente è necessario saltare il maggior numero di controlli di collisione possibili - le particelle che conosci sono a riposo non dovrebbero mai essere controllate, come quelle che hanno particelle adiacenti su tutti i lati - il che mi porta a pensare alle griglie. Forse potresti rappresentare l'intero "mondo" come una griglia e semplificare la logica da questo punto di vista - più o meno come fa Minecraft, non sei d'accordo?

In ogni caso, mi rendo conto che sto divagando un po ', ma si tratta di un argomento così aperta ... :)

1

È possibile monitorare quali particelle vengono effettivamente elaborate dal motore fisico? In tal caso, esiste un modo in cui è possibile interrompere l'elaborazione della fisica o limitare gravemente ciò che viene elaborato, se la velocità è inferiore a 0,01 o qualcosa del genere?

Se elabori solo le particelle che necessitano di elaborazione, puoi averne quante ne vuoi, assumendo che non si muovano tutte contemporaneamente!

Se questo è ancora un problema, sembra che una soluzione fluidodinamica sia più adatta, poiché la fluidodinamica è fondamentalmente un insieme di piccole particelle in movimento.

Ecco alcune informazioni interessanti sulla dinamica dei fluidi 2D:

http://www.ibiblio.org/e-notes/webgl/gpu/fluid.htm

tuo motore fisico potrebbe già contenere quello che ti serve.

+0

Sfortunatamente - la neve è interattiva all'utente - grazie per la tua risposta :) –

+0

OK, ho aggiornato la mia risposta di conseguenza. – rhughes

+0

@DaveBish Come sei/stai andando? – rhughes