2008-09-26 9 views
11

Ich bin fasziniert von der Leistung von Anwendungen wie "Rollercoaster Tycoon" und "Die Sims" und FPS-Spiele. Ich würde gerne mehr über die grundlegende Anwendungsarchitektur erfahren. (Nicht so sehr mit der Benutzeroberfläche - ich nehme an MVC/MVP Piriciples gelten hier. Noch bin ich mit der Mathematik und Physik an dieser Stelle beschäftigt.)Wie wird eine reale Simulation erstellt?

Meine Frage beschäftigt sich mit der Zehner oder Hunderte von einzelnen Objekten in der Simulation (Menschen, Fahrzeuge, Gegenstände, etc.), die alle bewegen, Entscheidungen treffen und erhöhen & reagieren auf Ereignisse - scheinen alle zur gleichen Zeit, und wie sie für so gute Leistung ausgelegt sind.

F: In erster Linie werden diese Objekte in einer riesigen Schleife nacheinander bearbeitet - oder ist jede Objektverarbeitung in ihrem eigenen Thread? Wie viele Threads sind in einer solchen Simulation praktisch? (Ballpark Abbildung natürlich, 10, 100, 1000)

Ich bin nicht auf der Suche nach einem Spiel, ich will nur die Design-Theorie, weil ich mich frage, ob ein solches Design für andere Anwendungen, wo mehrere Entscheidungen sein können scheinbar gleichzeitig gemacht.

Antwort

8

Es gibt zwei grundlegende Möglichkeiten, diese Art der Simulation Agent Based und System Dynamics zu tun. In der agentenbasierten Simulation würde jede Entität im Spiel durch eine Instanz einer Klasse mit Eigenschaften und Verhaltensweisen repräsentiert, alle Interaktionen zwischen den Entitäten müssten explizit definiert werden, und wenn diese Entitäten interagieren sollen, werden die Eigenschaften als Eigenschaften bezeichnet der wechselwirkenden Entitäten wird geändert.

System Dynamics ist völlig anders, es befasst sich nur mit Summen und Summen, es gibt keine Darstellung einer einzelnen Entität im System. Das einfachste Beispiel dafür ist das Predator and Prey-Modell.

Beide haben Vor- und Nachteile, der System Dynamics-Ansatz skaliert besser auf eine große Anzahl von Entitäten, während die Laufzeit kurz gehalten wird. Während mehrere Formeln berechnet werden müssen, ist die Berechnungszeit unabhängig von den Werten in der Formel. Aber es gibt keine Möglichkeit, eine individuelle Entität in diesem Ansatz zu betrachten. Mit dem agentenbasierten Ansatz können Sie Entitäten an bestimmten Orten platzieren und mit bestimmten Entitäten in Ihrer Simulation interagieren.

FSMs und Celular automata sind andere Wege, um Systeme in einem Spiel zu simulieren. Z.B. Im agentenbasierten Ansatz könnten Sie das Verhalten eines Agenten mit einer FSM modellieren. Simcity verwendeten Celular-Automaten, um einen Teil der Simulationsarbeit zu machen.

Im Allgemeinen werden Sie wahrscheinlich nicht ein großes riesiges Modell haben, das alles außer mehreren Systemen, die bestimmte Aufgaben erledigen, tun wird, einige von diesen müssen nicht sehr oft aktualisiert werden, z.B.etwas, das das Wetter bestimmt, andere brauchen möglicherweise ständige Updates. Auch wenn Sie sie in separate Threads einfügen, sollten Sie sie anhalten oder starten, wenn Sie sie benötigen. Möglicherweise möchten Sie die Arbeit über mehrere Frames aufteilen, z. Berechne nur Updates für eine bestimmte Anzahl von Agenten.

+0

Perfekt! Vielen Dank! –

1

Bis vor kurzem war die Logik und Verwaltung des Spiels in einem einzigen Thread in einem großen endlichen Automaten. Nun neigen Sie dazu, die verschiedenen Teile des Spiels (Audio, Grafik, Physik, Logik der Simulation usw.) in eigene FSMs in Threads aufzuteilen.

Edit: Btw, Threads sind eine sehr schlechte Möglichkeit, Dinge in einer Simulation zur gleichen Zeit zu haben - es führt zu Rennbedingungen. Es ist üblich, dass Sie einfach herausfinden müssen, was passiert, wenn Sie über Ihre Daten iterieren und sie getrennt speichern und dann anwenden, sobald alle Daten verarbeitet sind. Rince, wiederhole es.

+0

Konnte jedes Objekt in seinem eigenen Thread seinen Zustand (Eigenschaften) "zur gleichen Zeit" setzen und dann einen Master-Prozess mit den Ergebnissen haben. Keine Ereignisse oder Rennen. Aber die Schleife wartet nicht so lange auf jedes zu verarbeitende Objekt ...? –

+1

Sie könnten dies über threadpools oder einige so ziemlich effizient tun, aber ich habe herausgefunden, dass es besser ist, Ihre Daten in Blöcke aufzuteilen und dann Handler für diese herauszufädeln, einen Änderungssatz aufbauend, wie ich beschrieben habe. –

+0

Stimme überhaupt nicht zu deiner Antwort. Wenn es so einfach wäre wie "eine fette FSM mit Bits auf verschiedenen Threads", dann würden alle solche Spiele veröffentlichen. Es gibt viel mehr als diese stark vereinfachte Antwort. Hast du schon einmal an einem ernsthaften Spieltitel gearbeitet? –

0

@Cody Brocious

Diese CodeProject verwendet Linq diese Praxis zu demonstrieren. (Linq to Life)

+0

Ich hatte einen Kommentar hinzugefügt, wie diese Methode nicht so skalierbar und so war, bevor ich erkannte, dass dies nur eine Implementierung davon ist - verdammt mein Mangel an LINQ Verständnis;) Gute Verbindung. –

+0

Diese Antwort hätte ein Kommentar zu Codys Beitrag sein sollen, kein eigener Beitrag. –

+0

Dieses Projekt sieht sehr vielversprechend aus - danke! –

0

Zusätzlich zu den Vorschlägen würde ich empfehlen, das Simulations-Tag bei sourceforge zu durchsuchen. Es gibt eine Vielzahl von Simulationsprojekten mit unterschiedlichen Komplexitätsgraden.

Sourceforge

Auch empfehle ich folgendes Buch für einen grundlegenden Überblick, während es auf Physik konzentriert es befasst sich mit Fragen der Simulation.

Physics for Game Developers

+0

Danke! Ich werde beide Quellen prüfen. –

4

Der Quellcode zum ursprünglichen SimCity hat offen wie Micropolis bezogen. Es könnte eine interessante Studie sein.