Frage

Ich denke darüber nach, ein Spiel in reinem JavaScript und HTML5 zu entwickeln, ohne Plugins von Drittanbietern zu verwenden. Das Problem, mit dem ich ausgesetzt bin, ist, dass ich keinen Weg finden kann, verschiedene "Module" des Spiels in separate Threads zu trennen, wie den Render -Job, die Spiellogik, das Laden von Asset und so weiter.

Webarbeiter scheinen in der Lage zu sein, Code in verschiedene Threads zu trennen, aber das Problem mit ihnen sind die begrenzten Informationen, die ich zwischen ihnen übergeben kann. Zum Beispiel muss ich für den Render -Job für jedes Update des Spiels die ganze "Welt" mit allen Entitäten, Meshes, Texturen usw. übergeben, da Arbeiter -Threads den Speicher nicht teilen können. Es kann optimiert werden, wie das Senden der statischen Objekte nur bei der Initialisierung (Maschen, Texturen) und dann nur den Status eines Objekts zum Update (es ist die Welttransformation), aber es ist immer noch nicht wünschenswert.

Gibt es eine Möglichkeit, große Daten zwischen ihnen zu senden oder sie einige Objekte freizugeben? Oder gibt es eine andere Methode, um echtes Multithreading zu erreichen? Ich weiß, dass es einfachere Möglichkeiten gibt, dies mit Plugins/ Zahnrädern zu erreichen, aber ich muss nur Methoden verwenden, die im offenen Web verfügbar sind.

War es hilfreich?

Lösung

Der Web Worker von JavaScript ist in irgendeiner Weise ein besseres Programmiermodell für gleichzeitige Programmiermodell. Zum Beispiel ist es eine Veranstaltung und es gibt kein gemeinsames Objekt. Dies bedeutet, dass Sie nicht in das Gitterschloss einsteigen können (weil es überhaupt kein Schloss gibt) und ein Objekt kann nicht in einen ungültigen Zustand geraten, indem er gleichzeitig durch zwei Threads geändert wird.

Das Problem ist, dass Sie das herkömmliche Spielsystem nicht leicht oben in diesem Modell stapeln können. Sie müssen also das Spielsystem auf eine neue Weise entwerfen, um dieses Programmiermodell zu übernehmen, und ich denke, dass dies möglicherweise teuer ist.

Andere Tipps

Sie möchten wahrscheinlich Webarbeiter prüfen, ich habe keine Erfahrung mit ihnen, habe aber von ihnen gehört. Könnte Sie in die richtige Richtung führen.

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

Webarbeiter sind das Multithreading in JS am nächsten.
Im Augenblick.
Punkt.

SANS -Webarbeiter Es gibt keine wirkliche Möglichkeit, in JavaScript, von dem ich kenne, Multithreading zu machen.

Sie könnten eine Logik verwenden, um zu priorisieren, wie viel Zeit für bestimmte Aufgaben aufgewendet werden sollte. Sie können Funktionen erstellen, die Informationen in Staaten speichern (so können Loops beendet und dann zu einem späteren Zeitpunkt wieder aufgenommen werden). Jede Schleife weiß nur, wie viel Zeit es hat, bevor er seinen Zustand spart und die Funktion verlässt.

Die für Schleife hätte also auch eine Zeitbedingung ...

//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;
}

Sie können Ihren Code definitiv so priorisieren. Aber es gibt Nachteile. Das Speichern Ihres Staates führt nicht zu sauberem Code (insbesondere mit Schleifen in Schleifen). Es ist auch nicht so schnell, da Sie ständig Zeit überprüfen und Zustände sparen.

Ich empfehle einen funktionalen Ansatz, um die Aspekte Ihres Spiels zu komponieren. Siehe zB http://www.flapjax-lang.org.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top