Domanda

Sto pensando di sviluppare un gioco in puro JavaScript e HTML5, senza usare plugin di terze parti. Il problema che sto affrontando è che non riesco a trovare un modo per separare diversi "moduli" del gioco in thread separati, come il lavoro di rendering, la logica del gioco, il caricamento delle risorse e così via.

I lavoratori web sembrano essere in grado di separare il codice in diversi thread, ma il problema con loro sono le informazioni limitate che posso passare tra loro. Ad esempio, per il lavoro di rendering, devo passare l'intero "mondo", con tutte le entità, le mesh, le trame e così via per ogni aggiornamento del gioco, perché i thread dei lavoratori non possono condividere la memoria. Può essere ottimizzato, come inviare gli oggetti statici solo all'inizializzazione (mesh, trame) e quindi inviare solo lo stato di un oggetto su aggiornamento (la sua trasformazione mondiale) ma non è ancora desiderabile.

C'è un modo per inviare grandi dati tra di loro o farli condividere alcuni oggetti? O esiste un metodo diverso interamente per raggiungere la vera multithreading? So che ci sono modi più semplici per raggiungere questo obiettivo utilizzando plugin/ ingranaggi, ma devo utilizzare solo metodi disponibili sul Web aperto;

È stato utile?

Soluzione

Il web lavoratore di JavaScript è in qualche modo un modello di programmazione simultanea migliore. Ad esempio, è guidato dagli eventi e non esiste un oggetto condiviso. Ciò significa che non puoi entrare nel blocco della griglia (perché non c'è alcun blocco) e un oggetto non può entrare in uno stato non valido essendo modificato da due thread contemporaneamente.

Il problema è che non puoi facilmente impilare il sistema di gioco tradizionale sulla parte superiore di questo modello. Quindi devi progettare il sistema di gioco in un nuovo modo di adottare questo modello di programmazione e penso che questo potrebbe essere costoso.

Altri suggerimenti

Probabilmente vuoi guardare ai lavoratori web, non ho esperienza con loro ma ne ho sentito parlare. Potrebbe portarti nella giusta direzione.

http://ejohn.org/blog/web-workers/

Web-worker sono la cosa più vicina a Multithreading in JS.
Al momento.
Punto.

SANS Web Workers non c'è modo reale di fare multithreading in JavaScript che conosco.

Tuttavia, potresti usare un po 'di logica per dare la priorità a quanto tempo dovrebbe essere dedicato a fare determinati compiti. Potresti fare funzioni che archiviano informazioni negli stati (quindi i loop potrebbero essere usciti e poi ripresi in un secondo momento). Ogni ciclo sa solo quanto tempo ha prima che risparmia il suo stato ed esce dalla funzione.

Quindi anche il ciclo avrebbe una condizione temporale ...

//Loop over some iterator, exit if time is up
for (i = 1; i < max || timeNotUp(); i++)
{
}

//If exiting normally 
if (i == max)
{ //do somthing
}
//otherwise, save state
else
{
    this.i = i;
    this.otherStuff = otherStuff;
}

Puoi sicuramente dare la priorità al tuo codice in questo modo. Ma ci sono lati negativi. Il salvataggio del tuo stato non porta a un codice facile da seguire (specialmente con loop all'interno di loop). Inoltre, non è così veloce, dal momento che controlli costantemente il tempo e il salvataggio degli stati.

Consiglio un approccio funzionale per comporre gli aspetti del tuo gioco. Vedi ad es http://www.flapjax-lang.org.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top