Runder Tisch zum datenorientierten Design: Ihre Fragen, beantwortet

FERGUS BAIRD / UNITY TECHNOLOGIESSenior Content Marketing Manager
Feb 28, 2024|9 Min.
Runder Tisch zum datenorientierten Design: Ihre Fragen, beantwortet
Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.

Im Dezember veranstalteten wir einen DOTS-Roundtable mit den Stunlock Studios (V Rising) und Sunblink Entertainment(HEROish, Hello Kitty Island Adventure). Wir haben diese Early Adopters eingeladen, ihre Erfahrungen mit dem Data-oriented Technology Stack (DOTS) mitzuteilen, zu zeigen, welche Features und Fähigkeiten die datenorientierte Programmierung für ihre Spiele freigesetzt hat und wie sie die neueste Entity Component System (ECS)-Technologie in Unity 2022 LTS nutzen.

Während des Webinars gab es viele aufschlussreiche Fragen aus dem Publikum - so viele, dass wir sie nicht alle live beantworten konnten. Im Anschluss daran haben wir Joe Valenzuela, Director, Software Engineering bei Unity, und Rasmus Höök, Technical Director bei Stunlock Studios, gebeten, einige unserer Lieblingsfragen aus der Sitzung zu beantworten. Sehen Sie sich diese unten an, und sehen Sie sich das Webinar Maximieren Sie das Potenzial Ihres Spiels mit datenorientiertem Design auf Abruf hier an.

V Rising von Stunlock Studios

"Ist es besser, neue Projekte sofort mit DOTS zu starten oder mit normalen GameObjects und dann die Leistung durch den Wechsel zu ECS (entweder rein oder hybrid) zu optimieren?"

JOE VALENZUELA: Bei ECS, DOTS und datenorientiertem Design (DOD) geht es nicht nur um bessere Leistung. Es geht auch darum, die Komplexität zu vermeiden, die bei der Modellierung von Problemen durch objektorientierte Programmierung (OOP) entsteht.

Jeder, der vorhat, ein Multiplayer-Spiel zu entwickeln - insbesondere eines mit einem maßgeblichen Server und clientseitiger Vorhersage - sollte ernsthaft in Betracht ziehen, mit DOTS zu beginnen. Netcode for Entities bietet ein wirklich robustes, leistungsfähiges System, das skalierbar ist und es Ihnen ermöglicht, unkomplizierten Gameplay-Code zu schreiben.

Wenn Sie kein Multiplayer-Spiel entwickeln oder nur Prototypen erstellen und schnell neue Dinge ausprobieren möchten, sollten Sie den Einsatz von MonoBehaviour/GameObjects in Betracht ziehen.

"Ist es möglich, ein Spiel komplett mit dem DOTS-System zu erstellen, oder unterstützt DOTS nur das GameObject-System?"

JOE VALENZUELA: Nein, Sie werden wahrscheinlich irgendwann einige GameObjects benötigen. Das ist etwas, woran wir arbeiten.

"Was sind Nachteile oder Anwendungsfälle, in denen ein Entwickler DOTS nicht verwenden sollte?"

JOE VALENZUELA: Wahrscheinlich fragen Sie die falsche Person - ich kann mir keinen Fall vorstellen, in dem ich lieber etwas anderes als DOTS in Unity verwenden würde! Aber wenn Sie mich auf den Arm nehmen, werde ich wohl sagen, dass traditionelle MonoBehaviour/GameObject-basierte Projekte beim Prototyping wirklich hervorragend sind. Wenn Sie rasche Änderungen erwarten, wollen Sie nicht unbedingt viel Zeit mit der Erstellung von Bakers oder dem Entwurf Ihrer Daten verbringen. Das ist ein Bereich, den wir in Zukunft für DOTS optimieren wollen.

"Rasmus, haben Sie einen Ratschlag für die Einführung von Ingenieuren in die datenorientierte Programmierung?"

RASMUS HÖÖK: Ich denke, ein guter Anfang ist es, möglichst unkomplizierten und einfachen Code zu schreiben, um das eigentliche Problem zu lösen, das Sie haben. Versetzen Sie sich in die Denkweise eines Programmieranfängers und schreiben Sie sehr ergebnisorientierten Code, bei dem das Ziel darin besteht, dass der Code das tut, was Sie wollen. Das ursprüngliche Ziel sollte nicht sein, wiederverwendbaren Code zu schreiben, Abstraktionen zu schaffen oder was auch immer.

Bei den ersten Schritten mit ECS sollten Sie nicht zu viel nachdenken und nicht zu viel planen. Verwenden Sie lieber zunächst größere Komponenten und größere Systeme, anstatt sie in viele kleine Teile aufzuspalten. Dadurch wird Ihr Code leichter zu verstehen sein. Trennen Sie sich später, wenn Sie einen Grund dazu haben. Diesen Fehler haben wir definitiv schon früh gemacht.

Ich würde sagen, eine gute Gelegenheit, datenorientierte Programmierung zu praktizieren, ist, wenn Sie etwas zu optimieren haben. Dann haben Sie ein konkretes Problem, mit dem Sie experimentieren und Ihr Ergebnis messen können. Sie werden auch sehen, wie wichtig das Nachdenken über Daten ist.

"Wir hören viel darüber, dass DOTS genutzt wird, um größere und ehrgeizigere Spiele zu entwickeln, aber gibt es auch Vorteile bei einer Verkleinerung? Wie die Verwendung von DOTS in einem kleinen Projekt, um Systeme der unteren Leistungsklasse anzusprechen?"

JOE VALENZUELA: Ein effizienter Betrieb auf Systemen mit geringem Stromverbrauch verbessert die Qualität des Simulationscodes, den sie ausführen können. Außerdem verringert sich der Batteriebedarf batteriebetriebener Geräte, was zu einer längeren Betriebsdauer und einem insgesamt gesünderen System führt.

V Rising von Stunlock Studios
V Rising von Stunlock Studios

"Wenn man von SystemBase zu ISystem wechselt, wie geht man dann mit den Aufrufen zu verwaltetem Code um?"

JOE VALENZUELA: Technisch gesehen müssen Sie den verwalteten Code nicht loswerden, um ISystem zu verwenden - verwalteter Code kann von ISystem aus aufgerufen werden. Seine verwalteten Daten können nicht direkt in einem ISystem gespeichert werden - dafür würde ich verwaltete Komponentendaten verwenden.

Wenn Sie jedoch fragen: "Wie kann ich die Aufrufe von verwaltetem Code aus ISystem entfernen, damit ich Burst verwenden und die beste Leistung aus meinem Code herausholen kann?

Wenn Sie .NET-Container verwenden, finden Sie vielleicht einen geeigneten Ersatz in com.unity.collections. Wenn Sie eine Schnittstelle zu einer verwalteten Unity-API haben und es keine unverwaltete Alternative gibt, ist es manchmal hilfreich, die Arbeit in die Phasen "Daten holen" und "Verarbeiten" aufzuteilen, wobei in der letzteren die ISystem-basierte Verarbeitung stattfindet.

"Ich habe in der Dokumentation gelesen, dass ECS nicht mit der Architektur mehrerer Szenen kompatibel ist. Wie sollte dieser Ansatz also mit ECS umgesetzt werden?"

JOE VALENZUELA: Nichts in ECS schließt das additive Laden mehrerer Unity-Szenen aus. Diese Szenen werden jedoch keine ECS-Daten enthalten, sondern nur GameObjects mit MonoBehaviours.

Sie können eine beliebige Anzahl von Unterszenen erstellen, und jede dieser Unterszenen wandelt die GameObjects und MonoBehaviour-Daten in kompakte Entity- und Komponentendaten um, die zur Laufzeit geladen werden können. Unterszenen können weiter in Abschnitte unterteilt werden, und jeder Abschnitt kann je nach Bedarf ein- oder ausgestrahlt werden.

"Wie [stark] wirkt sich das Vorhandensein von hybriden Monobehaviours/DOTS auf den Determinismus in einem Projekt aus?"

JOE VALENZUELA: Determinismus ist kein binärer Zustand, und wir können nicht garantieren, dass jedes Ausführungsdetail zwischen den Läufen identisch ist. Im Allgemeinen wird die hybride Interoperabilität manchmal für Präsentationsdetails wie Partikelsysteme oder Audio benötigt, bei denen eine perfekte Reproduktion pro Bild nicht erforderlich ist.

Für Funktionen wie die Spielvorhersage sollten Sie Ihre Simulation in ECS laufen lassen.

Wie verwalten Sie Hunderte von Systemen? Werden sie alle ständig ausgeführt und führen nur dann keine Logik aus, wenn keine Entitäten in der Abfrage vorhanden sind? Oder aktivieren Sie kontextabhängig Systeme, die auf dem Spielzustand basieren?

JOE VALENZUELA: Um die Entwicklung zu erleichtern, haben wir die Systeme standardmäßig aktualisiert. Der Leistungsunterschied ist nicht groß, aber wenn Sie wirklich Hunderte von Systemen haben, könnten Sie davon profitieren, dass Sie sie latent aktualisieren, indem Sie RequireForUpdate aufrufen oder das Attribut RequireMatchingQueriesForUpdate verwenden.

Das Idiom in diesem Fall ist, ein RequireForUpdate<Foo>() zu dem relevanten System hinzuzufügen und Foo IComponentData in Ihren Szenen als eine Art Flagge zu verwenden, um die Aktualisierung dieser Systeme zu aktivieren.

"Ich habe gehört, dass DOTS die Leistung bei der Verarbeitung großer Datenmengen während der Laufzeit und während des Spiels verbessert (vor allem beim Rendering, soweit ich gehört habe). Ich habe aber auch gehört, dass DOTS die Produktionsleistung verbessert, indem es das notwendige Refactoring erleichtert. Könnten Sie ein wenig darüber erzählen, wie DOTS beim Refactoring hilft?"

JOE VALENZUELA: Ein großer Vorteil von DOTS, ECS und DoD im Allgemeinen ist aus meiner Sicht, dass mehr von Ihrem Simulationsstatus sichtbar und überprüfbar wird. Wenn Sie jemals versucht haben, Tests für eine OOP-Bibliothek hinzuzufügen, sind Sie vielleicht auf das Problem gestoßen, dass Sie am Ende eine große Menge an Funktionalität nachbilden oder instanziieren müssen, um den Zustand zu replizieren, der für den Aufruf einer "einfachen" Methodeninstanz erforderlich ist. Bei Systemen im DoD-Stil können Sie einen Transformationskern fast immer als eigenständige Funktion darstellen, die einen Werttyp in einen anderen umwandelt.

Dies ist wesentlich einfacher zu begründen, zu testen und zu parallelisieren.

"Nach meiner (laienhaften) Erfahrung führt DoD zu einer engen Kopplung zwischen den Daten und der Architektur, was dazu führt, dass Änderungen an den Datenstrukturen einen großen Refactoring-Aufwand verursachen. Ist das Ihre Erfahrung? Wie haben Sie dieses Problem bewältigt oder vermieden?"

RASMUS HÖÖK: Unserer Erfahrung nach müssen wir, wenn wir die Daten ändern, in der Regel den Code ändern, der sie verwendet, auch bevor wir ECS verwenden. Wir haben also nicht mehr gelitten, als wir es gewohnt sind!

JOE VALENZUELA: Ich glaube nicht, dass dies ein grundsätzliches Problem des Verteidigungsministeriums oder sogar unseres ECS ist, zumindest nicht in der Form, wie es sich im Laufe der Zeit entwickelt hat.

Zum einen besteht die traditionelle Methode zum Aufbrechen der engen Kopplung in der OOP normalerweise darin, instanzorientierte Funktionen und Klassenhierarchien zu erstellen. Das ist zwar in der Theorie schön, aber diese Art der Abstraktion ist eines der ersten Dinge, die bei der Leistungsprogrammierung verschwinden.

Es gibt nichts, was Sie daran hindert, Dienstprogramme in einem ECS zu schreiben. Es stimmt zwar, dass Sie in unserem ECS die Systeme erneut besuchen müssen, wenn Sie den Datenvertrag für bestimmte Abfragen ändern, aber das kann ein Zeichen dafür sein, dass Sie die Daten verstreut abfragen. Transformieren Sie wiederholt Komponentendaten? Kann das umgeschrieben werden, um die Anzahl der Mutationen pro Frame zu reduzieren? Wiederholtes Lesen von Komponentendaten? Vielleicht können Sie sie in eine unveränderliche Datenstruktur zu Beginn des Frames einbinden.

Abschließend kann man wohl mit Sicherheit sagen, dass das DoD oder zumindest ECS den Problemzustand viel deutlicher macht. Das ist nichts Negatives: Das ist ein anderer Kompromiss. Ich ziehe es vor, beim Refactoring über eine enge Kopplung nachzudenken als über eine lose oder implizite.

"Funktioniert ECS/OOP gut für mobile Spiele, oder können Sie diesen Ansatz für ein mobiles Spielprojekt empfehlen? Gibt es Risiken oder Überlegungen?"

JOE VALENZUELA: Wir haben mehrere Kunden, die ECS erfolgreich in ihren Handyspielen eingesetzt haben. In diesem GDC-Vortrag erfahren Sie, wie Sunblink Entertainment es für HEROish verwendet hat.

"Wie sind Sie bei der Vernetzung von V Rising vorgegangen? Haben Sie Netcode for Entities oder ein anderes Framework verwendet?"

RASMUS HÖÖK: Wir haben unseren eigenen Rahmen geschaffen. Wir haben schon sehr früh damit begonnen, DOTS für die Produktion zu verwenden und waren uns der damit verbundenen Risiken bewusst. Um so viele Risiken wie möglich auszuschalten, haben wir versucht, uns auf so wenige Pakete wie möglich zu verlassen und wenn möglich unsere eigenen zu entwickeln. Wir haben schon immer Multiplayerspiele entwickelt und unsere eigenen Lösungen verwendet, daher war es für uns kein Problem, dies selbst zu tun.

"Ist ECS stabil genug für die Produktion? Wir haben in den letzten Monaten mit einem Prototyp damit gekämpft und sind uns nicht sicher, ob es sich dabei um Wachstumsschmerzen handelte, während wir lernten, oder ob es noch nicht ganz bereit ist, ein reines ECS-Produktionsprojekt anzustreben."

RASMUS HÖÖK: Ich würde sagen, es ist stabil genug für die Produktion, aber es fehlt an Funktionen, die für viele Spieleentwickler selbstverständlich sind. Unser Gameplay-Code ist reiner ECS in V Rising, aber für die Präsentation, wie z.B. animierte Charaktere, Partikeleffekte und die Benutzeroberfläche, werden GameObjects verwendet. Realistisch betrachtet, halte ich einen hybriden Ansatz für die meisten Teams, die heute ein Projekt beginnen, für die beste Lösung.

Wir haben V Rising mit einem einseitigen Ansatz durchgeführt. Wir verwenden reines ECS, um Daten nur an GameObjects zu übertragen, niemals umgekehrt. Zum Beispiel halten wir den Zustand eines Charakters in ECS-Daten fest - Eingabe, Geschwindigkeit usw., die über den Bewegungszustand entscheiden und darüber, welche Animation zu welchem Zeitpunkt und mit welcher Geschwindigkeit aktiv sein sollte. Dann stellen wir sicher, dass sich der Animator des GameObjects in diesem Zustand befindet. Unabhängig davon, in welchem Zustand sich der Animator befindet, hat dies keinen Einfluss auf das Spielgeschehen. Ich denke, diese Trennung vereinfacht das Spiel insgesamt.

JOE VALENZUELA: ECS ist produktionsreif und wird von Kunden auf der ganzen Welt genutzt, aber wir haben noch einen weiten Weg vor uns, bis das Erlebnis so nahtlos ist, wie wir es uns wünschen. Bleiben Sie dran für zukünftige Entwicklungen - und danke für die Nutzung von DOTS!

Verwirklichen Sie Ihr ehrgeiziges Spiel mit DOTS, mit dem Sie skalierbare, leistungsstarke Spiele und unvergessliche Erlebnisse schaffen können. Holen Sie sich die neuesten Funktionen mit Unity 2022 LTS und probieren Sie die neueste Technologie in Unity 6 Preview aus.