Ich habe keine Erfahrung mit Spielentwicklungsfragen, sondern als Programmierer. In der Sprache Scala können Sie skalierbares Multitasking mit Schauspielern haben, das, wie ich höre, sehr stabil ist. Sie können sogar Hunderttausende davon problemlos gleichzeitig ausführen.
Also dachte ich, vielleicht können Sie diese als Basisklasse für 2D-Sprites verwenden, um aus der Spielschleife auszubrechen, die es erfordert, alle Sprites zu durchlaufen und zu verschieben. Sie würden sich im Grunde genommen ereignisgesteuert bewegen.
Wäre das für ein Spiel sinnvoll? So ein Multitasking? Immerhin wird es auf der JVM laufen, obwohl das heutzutage kein großes Problem sein sollte.
BEARBEITEN:
Nach einer Weile bemerkte ich, dass diese Idee nur einen wirklichen Vorteil bietet: Multicore-Unterstützung. Eine einfache Spieleschleife läuft nur auf einem Kern und durchläuft alles nacheinander.
Da moderne Computer heutzutage sogar zu Hause über zwei oder mehr eingebaute Kerne verfügen, ist es meiner Meinung nach eine gute Idee, Spielprogrammierern die effiziente Nutzung der anderen Kerne zu ermöglichen. Schließlich denke ich, dass der Spieler normalerweise nur das Spiel auf seinem 8-Core-Rechner laufen lässt. Warum also nicht?
Der andere Vorteil, den ich sehe, ist der, den Sie in Scala haben können RemoteActors
, der genauso behandelt werden kann, aber auf einem anderen Computer ausgeführt wird. Vielleicht kann dies auch das Spielen im Netzwerk vereinfachen.
Ich beabsichtige, das so schnell wie möglich in meine Scala 2D-Engine zu integrieren.
quelle
Antworten:
Ich habe es nicht versucht, aber ich bin ein Scala-Programmierer, und ich würde sagen, dass dies nicht der beste Ansatz ist. Sprites müssen synchron animiert werden. Schauspieler haben keine Garantie dafür, dass sie fair ausgeführt werden - einige Sprites sind möglicherweise schneller als andere, was Sie nicht wollen. Vielleicht möchten Sie eine Barriere verwenden, um sie zu synchronisieren, aber warum sollten Sie dann Schauspieler verwenden? Wenn Sie sich nur auf die Nachrichtenübermittlung verlassen, ist die Implementierung dieser Art der Synchronisierung (Implementierung einer Barriere für mehr als 1000 Akteure) ein Overkill.
Ein weiteres Problem ist - wofür würden Sie die Nachrichtenübermittlung verwenden? Benötigst du deine Sprites, um zu kommunizieren? Sie könnten vom Hauptdarsteller eine Nachricht senden, in der Sie jedem Sprite mitteilen, dass er zum nächsten Frame wechseln soll. In Bezug auf die Leistung sind dies jedoch mehr als das direkte Aufrufen von Methoden und das Durchlaufen einer Reihe von Sprites.
Mir scheint, dass Sie hier eine Art sehr leichtes Multitasking benötigen und überhaupt keine Nachricht weitergeben. Wenn Sie dies sicherstellen möchten, ist es wahrscheinlich der beste Weg, eine eigene schauspielerähnliche Implementierung zu implementieren, die Fairness gewährleistet, aber das ist zu viel Arbeit für zu wenig Gewinn. Eine andere Sache, die man sich ansehen sollte, ist die funktionale reaktive Programmierung, und
scala.react
ich glaube, das passt besser zu diesem Anwendungsfall.Ich habe in Scala eine isometrische 2D-Spiel-Engine implementiert. Ich habe nur 1 globalen Schauspieler verwendet, um sichtbare Sprites zu aktualisieren, die animiert wurden.
Möglicherweise möchten Sie Ihre Spielelogik mithilfe von Akteuren implementieren - zum Beispiel, um Berechnungen auf verschiedenen Teilen Ihrer Spielekarte an verschiedene Akteure zu verteilen, damit diese den Spielstatus parallel aktualisieren - und einen Leistungsgewinn erzielen. Ich würde nicht einen einzelnen Schauspieler pro Spielobjekt verwenden, sondern einen Schauspieler pro Region. Wenn Sie zu feinkörnig arbeiten, leidet die Leistung.
Wenn ich Sie wäre, würde ich es trotzdem versuchen, nur um zu sehen, was passiert.
quelle
Was würde das Ereignis sein, das sie bewegt?
Wäre es ein Event, das Sie einmal pro Frame ausstrahlen?
Und wenn ja, wie hat dies das System in praktischer Hinsicht verändert?
Als ich ursprünglich die Objektorientierung im Kontext von C ++ studierte, stellte ich fest, dass einige Leute gerne an eine Aussage denken
xyz.doThis(x)
, die beispielsweise "Sende die doThis-Nachricht an xyz (mit der Nutzlast x) und warte auf eine sofortige Antwort" bedeutet. Auf dieser Ebene gibt es keinen wesentlichen Unterschied zwischen einem ereignis- oder nachrichtenbasierten System und einem normalen prozeduralen System.quelle
xyz.doThis(x)
dies abgeschlossen ist. Ich denke, dies könnte sogar dazu beitragen, die Spielelogik zu beschleunigen, insbesondere auf Mehrkernsystemen.Das ist ein cooler Ansatz, um über die Aktualisierung Ihrer Spielobjekte nachzudenken. Ich kenne Scala nicht, aber ich sage, probieren Sie es aus und sehen Sie, wie es ausgeht, und veröffentlichen Sie noch besser Ihre Ergebnisse!
Die wichtigsten Fragen, die mir in den Sinn kommen, sind: Wie können Sie steuern, wie oft einige Spielobjekte im Vergleich zu anderen aktualisiert werden? Müssen Sie sich Sorgen machen, dass die Sprite-Darsteller zu viele Zyklen in Anspruch nehmen, sodass das Rendering-System nicht alle 1/60 | 30 | 24 Sekunden Zeit hat, einen Frame zu zeichnen?
Eine andere zu berücksichtigende Sache ist, wie sich dies auf die Auflösung von Spieler- gegen KI-Interaktionen auswirkt, die von der Reihenfolge einer Abfolge sehr schneller Ereignisse abhängen. Je nach Art des Spiels, das
nicht kannwahrscheinlich nicht viel Materie.quelle
Nun, ich bin auch kein großer Programmierer, aber ich sehe kein Problem in Ihrem Vorschlag. Ich dachte nicht einmal an eine solche Art, Schauspieler zu entwickeln.
Es mag eine ziemliche Herausforderung sein, da die Folgenabschätzung sehr genau sein muss, um nicht beachtetes Verhalten zu vermeiden, aber im Übrigen halte ich es für einen guten Vorschlag
quelle
Wenn mit Sprite Spieleinheit gemeint ist , dann sicher.
Spieleinheiten sollten sich niemals selbst zeichnen. Sie sollten ein Grafikhandle aktualisieren, das beschreibt, wo und wie sie gezeichnet werden müssen. Das Rendersystem oder das Szenendiagramm oder was auch immer für die eigentliche Zeichnung verwendet wird. Es gibt eine Grafikkarte, die alle 16ms synchronisiert werden muss. Ein solches Setup funktioniert einfach nicht gut für die verteilte asynchrone Verarbeitung.
Das Rendersystem sollte ein Schauspieler sein (oder möglicherweise ein Paar, wenn Sie schwierig sind). Wenn Spieleinheiten das Grafikhandle aktualisieren, werden Nachrichten an das Rendersystem gesendet. Mit dem Rendering-System können sie alle möglichen Entscheidungen und / oder Optimierungen treffen, z. B. Batch-Rendering, Okklusion, Physik-Jitter-Glättung usw.
Ich bin kein Scala-Entwickler, aber ich habe ziemlich viel mit Erlang gemacht. Also, wenn einige meiner Scala-Begriffe falsch sind, bitte vergib mir.
quelle