Sistema di particelle flessibili - Inizio

Sistema di particelle flessibili - Inizio

I sistemi di particelle sono fantastici! Non solo puoi creare effetti sorprendenti, ma puoi anche ottimizzare il codice e spingere sempre più pixel sullo schermo. Questa serie di post tratterà come progettare un sistema di particelle flessibile e applicare una serie di ottimizzazioni per eseguirlo più velocemente. Flessibile significa che può essere utilizzato in applicazioni reali e per una varietà di effetti grafici.

Introduzione

Da tempo gioco con il mio piccolo sistema particellare. Un post precedente mostra alcuni effetti che sono stato in grado di realizzare usando il sistema. Da quel momento non ho creato più effetti, tuttavia ho dedicato questo tempo a ottimizzazioni e miglioramenti.

Vorrei mostrarvi di più, o dire che ho ottimizzato il codice del 100000%... ma non è così facile :) Penso comunque sia prezioso condividere la mia esperienza attuale.

Questo post tratterà le basi del sistema particellare e le mie ipotesi.

Iniziamo!

La serie

  • Dimostrazione iniziale delle particelle
  • Introduzione
  • Contenitore di particelle 1 - problemi
  • Contenitore di particelle 2 - implementazione
  • Generatori ed emettitori
  • Aggiornatori
  • Rendering
  • Introduzione all'ottimizzazione
  • Strumenti per l'ottimizzazione
  • Ottimizzazioni del codice
  • Ottimizzazioni del rendering
  • Riepilogo

Quadro grande

Cosa è necessario per creare un sistema di particelle:

  • matrice di particelle - abbiamo bisogno di un contenitore per conservare le particelle. Le particelle sono cose dinamiche, quindi abbiamo anche bisogno di un modo efficiente per creare una particella viva o morta. Sembra che anche std::vector non è abbastanza per questo scopo. Un'altra cosa è quali dati dovrebbe contenere una particella? Dovremmo usare Array of Struct (AoS) o forseStruct of Arrays (SoA)?
  • generatori/emettitori - creano (vivono) particelle, ne fissano i parametri iniziali
  • aggiornatori - quando una particella è viva ci deve essere un sistema che la aggiorni e ne gestisca i movimenti.
  • un renderer - infine abbiamo bisogno di un modo per inviare tutti i dati allo schermo e rendere l'intero sistema. Il rendering del sistema di particelle è di per sé un argomento interessante perché ci sono molte possibili soluzioni e tecniche.

E probabilmente è tutto per iniziare bene.

Sistemi di particelle stateless vs State preservando

Quando si implementa un sistema di particelle è importante notare che possiamo aggiornare le particelle in due modi:

Via senza stato

Significa che calcoliamo la posizione/i dati/lo stato correnti dai valori iniziali e non memorizziamo questo stato calcolato. Dai un'occhiata a questa semplice equazione di movimento usata in un semplice sistema di particelle:

pos = pos_start + vel_start*time + 0.5*acc*time*time;

Questo ha calcolato pos è usato solitamente solo per il rendering. Nel frame successivo, il time cambierà e quindi otterremo un valore diverso per pos .

Molti tutorial grafici hanno tali sistemi di particelle. È particolarmente visibile come esempio per i vertex shader. È possibile passare i dati iniziali delle particelle al vertex shader e quindi aggiornare solo il valore temporale. Sembra carino ma è difficile creare effetti avanzati usando tale tecnica.

Pro:

  • semplice da usare, non sono necessari dati aggiuntivi, basta iniziare i valori
  • molto veloce:basta creare i dati iniziali, è necessario aggiornare il buffer delle particelle solo quando una particella viene uccisa o nata.

Contro:

  • solo per semplici equazioni di movimento

conservazione dello stato

Come suggerisce il nome, memorizzeremo lo stato attuale delle particelle. Useremo gli stati precedenti per calcolare quello corrente. Uno dei modi più popolari per farlo è chiamato metodo Eulero:

vel = vel + delta_time * acc;
pos = pos + delta_time * vel;

Pro:

  • può essere utilizzato per creare effetti avanzati

Contro:

  • necessita di una memoria per lo stato interno/corrente
  • Sono necessari più calcoli e aggiornamenti rispetto al sistema stateless

Lascerò questo argomento, ma tornerà quando mostrerò l'effettiva implementazione del sistema.

Presupposti/Requisiti

Cosa vorrei ottenere con il sistema:

Usabilità:l'intero sistema non sarà solo un piccolo esperimento con un semplice ciclo di aggiornamento, può essere utilizzato per creare diversi effetti.

Facile da estendere:diversi moduli o opzioni per creare parti proprie.

Prestazioni:dovrebbe essere abbastanza veloce. Questa è una specifica piuttosto vaga, ma l'intera parte dell'ottimizzazione sarà un ottimo terreno di gioco per testare nuove idee.

  • Miro ad almeno 100.000 particelle che funzionino senza intoppi (60 fps) sul mio sistema. Sarebbe bello avere 1M, ma non sarà così facile con la versione CPU

Solo CPU - So che attualmente le implementazioni GPU sono migliori, ma per l'esperimento scelgo solo CPU. Forse nella seconda versione lo riscriverò su OpenCL o OpenGL Compute Shaders.

  • La versione CPU offre anche la possibilità di sperimentare i trasferimenti da CPU a GPUbuffer.
  • Ho usato spesso un ottimo libro:Ottimizzazione dei videogiochi, con molte informazioni preziose su CPU/cache/GPU

Finora semplice renderer OpenGL 3.3+

Cosa c'è dopo

Nel prossimo articolo scriverò dei dati delle particelle e dei loro contenitori utilizzati nel sistema.

Leggi il prossimo:Contenitori di particelle 1 -problemi

Ecco una serie di link e risorse che mi hanno aiutato (o aiuteranno) nell'implementazione:

  • Il ricettario per l'ottimizzazione del software :Ricette ad alte prestazioni per piattaforme IA-32, 2a edizione, Intel Press; 2a edizione(dicembre 2005) - Libro difficile da trovare, ma l'ho vinto alla GDC Europe2011 :)
  • Architettura del motore di gioco, Seconda edizione
  • Intel Creazione di un sistema particellare con Streaming SIMDExtensions - tutorial abbastanza vecchio, ma molto semplice da capire.
  • Costruire un Million-ParticleSystem -per
  • Sistemi di particelle da zero di MattGreer - ottimo articolo per javascript e WebGL sulle particelle
  • Gamasutra Costruire un Advanced ParticleSystem

CodiceProgetto