Frage

Die Art der Simulationsspiel, das ich im Sinn haben, ist die Art, wo man die Dinge an verschiedenen Orten und Arbeiter / Transporter zu bauen, die solche Stellen zu verbinden.

Etwas mehr wie die Siedler-Serie.

Nehmen wir an, ich will keine Grafiken zur Zeit, , dass Ich glaube, ich verwalten können.

So meine Zweifel sind die folgenden:

  1. Sollte jede Einheit eine Klasse und jeder haben einen Thread?
  2. Sollten Entitäten in Listen innerhalb von Klassen gruppiert werden und jeder hat einen Thread?

Wenn man nimmt Implementierung 1, ist es sehr schwer sein wird auf Low-End-Maschinen läuft und skaliert nicht gut für eine große Zahl.

Wenn man nimmt Implementierung 2, es wird in Bezug auf die Ressourcen besser sein, aber dann ...

Wie soll ich Gruppe der Entitäten?

  1. Haben Sie eine Klasse für Häuser im Allgemeinen und eine Schnittstellenliste verwalten das?
  2. Haben Sie eine Klasse für bestimmte Gruppen von Häusern und eine Objektliste verwalten das?

und was Fäden?

  1. Sollte ich die vereinfachHauptSpiel Schleife?
  2. Sollte ich einen Thread für jede Klassengruppe haben?
  3. Wie Arbeiter / Transporter fit auf dem Bild?
War es hilfreich?

Lösung

Der normale Ansatz Threading gar nicht verwenden, sondern implementiert Entitäten als Zustandsmaschinen. Dann wird Ihr mainloop sieht wie folgt aus:

 while( 1 )
{
    foreach( entity in entlist )
    {
        entity->update();
    }

    render();
}

Andere Tipps

Die MMORPG Eve Online nutzt stackless Python und das Schauspieler-Modell einen Thread-pro-Einheit-System ohne die Ressource Hit zu emulieren.

Schauen Sie sich diesen Link für weitere Informationen: http://harkal.sylphis3d.com / 2005/08/10 / multithreaded-Spiel-Scripting-mit-stackless-python /

Ich bin ziemlich sicher, dass Sie nur einen Thread der Ausführung der Spiellogik haben wollen. Mit mehreren Threads werden nichts beschleunigen, und wird nur der Code verwirrend. ein Hauptspiel Schleife ist völlig in Ordnung, wenn die Dinge etwas schwieriger, wenn das Spiel Multiplayer hat.

Ich bin ein wenig verwirrt über den Teil Ihrer Frage zu Klassen. Wenn ich Ihre Frage richtig verstanden hat, mein Vorschlag wäre, eine Klasse für jede Art von Hause zu haben sein (Schweinefarm, Windmühle, usw.) von einer gemeinsamen abstrakten Basisklasse House abzuleiten. Sie würden dann speichern Sie alle Häuser in der Spielwelt in eine Liste der Häuser.

Denken Sie über Erlang verwenden. Mit Erlang können Sie viel mehr Prozesse Laichen (= leichte Fäden) als bei einem normalen System-Thread. Weiter seine verteilt, was bedeutet, wenn Ihr System gut genug ist nicht, fügen Sie einen anderen Knoten.

Eine weitere Alternative wäre stackless Python (oder die aktuelle Python Alternative), wie es auch eine Art von lightweightthread unterstützen, die für Game-Engines sehr kühl ist. Eve Online nutzt es für seine Server. Aber es ist nicht verteilt wird, aber das kann leicht von Hand erreicht werden.

Während die Antwort von @ Mike F meistens richtig ist, die Sie im Auge zu tragen haben, die in einem foreach Zyklus über die Entitäten Iteration macht die Reihenfolge der Auswertung deutlich deterministisch, die unerwünschten Nebenwirkungen hat. Auf der anderen Seite, eröffnet mögliche Themen Einführung für heisenbugs und Concurrency Probleme, so dass die beste Art und Weise habe ich und verwendet gesehen stützt sich zwei Zyklen auf die Kombination: die erste sammelt Aktionen von Agenten / Arbeiter auf der Grundlage früherer Zustand, komponiert der zweite Zyklus die Ergebnisse der Aktionen und aktualisiert den Zustand der Simulation. Um mögliche Verzerrungen zu vermeiden, bei jedem Zyklus der Reihenfolge der Auswertung randomisiert. Dieses BTW skaliert massiv parallele Auswertung, vorbehaltlich eine Synchronisation am Ende eines jeden Zyklus.

Ich mag vermeiden, eine eigene Klasse für jede Entität zu machen, denn dann werden Sie Situationen, wo Sie sind entweder zu wiederholen Code für gemeinsam genutzte Funktionen, oder du wirst einen flippigen Vererbungsbaum hast.

Ich würde argumentieren, dass Sie wollen, was eine einzige Klasse ist und Objekte mit Funktionalität auf sie zusammengesetzt ist. Ich sah einen Artikel auf einem Blog zu diesem Begriff in einem RTS sprechen ... warte, ich glaube, es war eine Tour von Design-Muster, dass jemand schreibt .

Mit den Besucher-Mustern einen Thread auf jedes Objekt DoEvents (mangels einem besseren Wort) Methode Laichen jedes Objekt zu sagen, zu tun, was sie während dieser gegebenen Schleife tun werden. Synchronisieren Sie die Fäden am Ende der Schleife, weil Sie einige Objekte mit komplexer Logik immer noch nicht haben wollen tut seine Sache von zehn Schleifen zurück, als es in Wirklichkeit war vor fünf Schleifen zerstört.

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