Wir haben lange mit Unity zusammengearbeitet und konnten nicht anders, als ihre Jungs zu den Pixonic DevGAMM Talks einzuladen, die im September stattfanden. Feldingenieur Valentin Simonov erklärte, wie die Architektur von Spielen unter Berücksichtigung der Vorteile neuer Technologien geplant werden kann. Unity arbeitet seit mehreren Jahren daran, um ein bisher unerreichbares Leistungsniveau zu erreichen. Sie können die Präsentation auf YouTube anhören und das Transkript mit Folien direkt unter dem Schnitt lesen.
Was ist, wenn ich sage, dass Sie die Produktivität Ihres Spiels um das Zehnfache steigern können? Tatsächlich ist dies nicht ganz richtig, aber in jedem Witz steckt etwas Wahres. Ich möchte darüber sprechen, woran wir gerade arbeiten, was die Zukunft von Unity sein wird und was Sie jetzt nutzen können.
Unity macht ganz andere Spiele. Hier sind einige Beispiele, die ich selbst spiele. Sie verwenden unterschiedliche Funktionen und benötigen unterschiedliche Leistung, einen unterschiedlichen Entwicklungsansatz.

Und wir arbeiten an einem Projekt, das wir Performance by Default nennen. Dies sind einige Besonderheiten, die bei richtiger Verwendung zu einer deutlichen Leistungssteigerung führen. Bei einigen Aufgaben haben wir x10 und sogar x11 gemessen. Besonders bei den Problemen der Simulation einer großen Anzahl von Objekten, die miteinander interagieren.
Wenn wir jedoch standardmäßig über Perfomance sprechen, bedeutet dies, dass Sie den Entwicklungsansatz und den Ansatz für die Architektur von Spielen stark ändern müssen. Und tatsächlich braucht das nicht jeder.
Eine beliebte Frage: „Was machst du in deinem ECS? Sie entfernen alle GameObjects, entfernen alle Transformationen, Hierarchien und Komponenten? “ Nein, wir alle verlassen es. Sie können mit Unity genauso arbeiten wie jetzt, aber wenn Sie mehr Leistung wünschen, müssen Sie die Technologien kennen, über die ich kurz sprechen möchte.
Und ich möchte eine andere Technologie namens Scriptable Render Pipelines (SRP) erwähnen, mit der Sie eine Render-Pipeline für Ihr Spiel effizienter schreiben können. Sie haben wahrscheinlich die Demo gesehen, die wir auf einer von Unite gezeigt haben. Hier auf dem PC wird in Echtzeit eine riesige Anzahl von Einheiten simuliert, etwa 60.000 (es erreicht 100.000 und beginnt sich etwas zu verlangsamen):
Und die neuen Funktionen, über die ich sprechen möchte, sind: Entity Component System (ECS), C # Job System, unser neuer Burst-Supercompiler und Scriptable Render Pipelines (SRP).

Ich wiederhole: Es liegt an Ihnen, zu entscheiden, ob Sie mit uns weitermachen, neue Technologien erlernen oder Spiele entwickeln möchten, die gut Geld verdienen und einfach gemacht werden.
Um zu verstehen, was wir zu lösen versuchen, ist es wichtig, den Zustand des Eisens im Jahr 2018 zu verstehen.

Beachten Sie, wie die Leistung und Anzahl der CPU-Kerne zunimmt. Von einem Punkt an ging die Single-Thread-Leistung sogar zurück. Das heißt, wir haben jetzt viele Kerne, aber ihre Produktivität wächst nicht so schnell. Deshalb möchten wir die Kraft aller Kerne nutzen.

Mein Telefon hat 8 Kerne: 4 starke und 4 schwache. Und ein modernes Telefon kann so schnell arbeiten wie ein moderner Computer (aber aufgrund von Überhitzung nicht sehr lange). Sie müssen auch verstehen, dass zur Leistungssteigerung nicht nur alle Kerne verwendet werden, sondern auch die Single-Core-Leistung optimiert wird.
Und das letzte Bild, das wir immer als Beispiel dafür geben, wie die Prozessleistung steigt und die Speicherzugriffsgeschwindigkeit nicht so stark zunimmt:

Es ist ersichtlich, dass der Zugriff auf den Speicher jetzt extrem langsam ist. Prozessorhersteller tun viel, um diesen Unterschied auszugleichen - fügen Sie Caches hinzu, CPUs sind mit spekulativen Berechnungen beschäftigt und versuchen vorherzusagen, welcher Code als nächstes ausgeführt wird. Und wenn Sie bei der Erstellung Ihres Spiels nicht darüber nachdenken (oder wenn wir eine Engine für Sie erstellen), können wir moderne Prozessoren nicht voll ausnutzen.
Viele von Ihnen werden wahrscheinlich Stunden damit verbringen, sich ein ähnliches Bild in Unity anzusehen:

Hier können Sie sehen, dass es Multithreading gibt, aber die verbleibenden Kerne und Threads sind meistens nicht beschäftigt. Es wird etwas getan, aber ich würde sie gerne vollständig besetzen.
Jetzt haben wir Rendering, das ist so eine Black Box. Sie haben die Wahl: Weiterleiten oder Zurückgestellt sowie verschiedene Einstellungen für Materialien, Shader, Befehlspuffer usw. Sie können ein schönes Bild machen, aber viele Algorithmen sind äußerst schwierig zu implementieren.

Und wir alle kennen die Architektur in Unity: Komponenten, GameObjects, Hierarchie von Transformationen, den gesamten Code, alle Daten in MonoBehaviour und jede Komponente verarbeitet ihre Daten.

Es gibt jedoch Probleme mit dem aktuellen Stand der Dinge. Früher oder später stoßen Sie darauf und verstehen, wie Sie es brauchen und nicht müssen. Die Hierarchie der Objekte selbst hat einen gewissen Overhead, und einige Entitäten müssen überhaupt keine GameObjects sein. Und wenn Sie eine große Anzahl von Komponenten und Updates von diesen haben, wird alles viel langsamer. Ich habe einmal
diesen Artikel geschrieben , der immer noch relevant ist, wenn Sie wissen möchten, wie man es nicht macht.

Und das Wichtigste im Zusammenhang mit Prozessoren ist, dass alle Komponenten und Daten im Speicher verstreut sind, wodurch die Verwendung des Prozessor-Cache unterbrochen wird.
Jetzt möchte ich schnell durch neue Funktionen gehen.

Ich werde mich nicht sehr darauf konzentrieren, was ECS ist und wie es funktioniert. Der Punkt ist, dass wir eine Entität haben, die nur die ID bestimmter Entitäten im Spiel ist - sie speichern Daten in Form von Komponenten, d. H. Nur Daten, kein Code. Und Systeme verarbeiten Entity mit bestimmten Komponenten und ändern diese Daten irgendwie.
Warum machen wir unser ECS und wie wird es besser sein als die Konkurrenz? Es gibt einige Punkte. Erstens nicht ganz offiziell, aber wir denken, dass wir den Motor jetzt machen würden. Es ist klar, dass wir GameObjects, die aktuellen Komponenten von Unity, nicht loswerden, alles komplett wegwerfen und ECS installieren wollen. Aber wir wollen uns auf einen besseren Motor zubewegen.

Wir setzen auf hohe Leistung. Vor nicht allzu langer Zeit hat sich Mike Acton uns angeschlossen (wenn Sie sich in der C ++ - Entwicklung befinden, wissen Sie, dass er einer der Evangelisten für datenorientierte Programmierung ist). Und wir möchten, dass das gesamte System so schnell wie möglich funktioniert - schneller als C ++.
Wir denken auch darüber nach, wie verschiedene Dinge nativ in ECS integriert werden können. Vor einiger Zeit haben wir angekündigt, dass wir ein neues Netzwerk erstellen, das ebenfalls auf ECS basiert. Es wird möglich sein, ein Multiplayer-Spiel auf ECS zu erstellen und Code zwischen Client und Server zu teilen.
Arbeiten an Debugging-Tools in Unity. Das heißt, ECS existiert sozusagen getrennt von GameObjects und Komponenten, und dies ist sehr unpraktisch. Wir wollen die Dinge vereinfachen.
Jetzt gibt es eine DebugView, die ungefähr so aussieht:

Hier können Sie sehen, welche Art von Entität Sie haben, welche Systeme wie viel Zeit für die Verarbeitung benötigen, welche Systeme mit welchen Komponenten arbeiten und für jede Komponente, die Sie im Inspektor sehen können, welche Daten jede Entität in den Komponenten hat (ich stelle fest, dass sich die API häufig ändert und viele Tutorials sind möglicherweise bereits veraltet.
Wenn Sie von unserer neuen Entwicklung Unity for Small Things gehört haben (dies ist eine sehr kleine Laufzeit, mit der Sie Spiele für Instant Messenger erstellen können), ist dort auch alles auf ECS aufgebaut.
In letzter Zeit ist der Boom der Entwicklung und des Übergangs zu ECS eine sehr beliebte Technologie, die jeder kennen muss.
Wir haben eine Konferenz für Programmierer, daher ist es schwierig, auf eine Code-Folie zu verzichten. Da dort viel Code vorhanden ist, ist es schwierig, ein verständliches Teil herauszuholen, um etwas klarer zu machen.

Tatsächlich habe ich ein System aus dem Beispiel genommen, das mit dem C # Job System funktioniert (dazu später mehr), und wir tun viel, um die Codemenge zu reduzieren und einen Syntax-Shugar hinzuzufügen.
Es gibt ein System, das mit RotationData-Komponenten arbeitet, und es benötigt auch GameObject-Transformationen, die durch ein spezielles TransformAccessArray dargestellt werden. Und jedes Update des Systems, das wir erstellen, Job, diesen Job ausführen, irgendwo aktualisieren, kann in mehrere Gruppen unterteilt und auf verschiedenen Threads ausgeführt werden.
Wie im Projekt verwenden? Genau wie bei anderen ECS-Implementierungen müssen Sie verstehen, dass Sie ganz anders denken müssen (im Gegensatz zu GameObjects und Transforms). Und gewöhne dich an diese Idee. Es ist klar, dass Sie von Anfang an mit dem Projekt beginnen müssen, da ich sehr oft Fragen bekomme wie „Wir haben das Spiel gemacht und möchten zu ECS wechseln - wie?“. Im fertigen Spiel ist dies sehr schwierig.

Wir müssen die Interaktion mit Unity durchdenken, da ECS in seiner kleinen Welt getrennt lebt. Wir bieten einige Möglichkeiten für die Interaktion mit GameObjects und Transforms, aber Physik, Rendering usw. werden hier immer komplizierter. Und obwohl Sie sich damit abfinden müssen, dass ein Großteil der vertrauten Benutzeroberfläche nicht verfügbar sein wird, arbeiten wir auch daran.
Und sofort müssen Sie darüber nachdenken, dass Sie Systeme in das Jobsystem schreiben, das viel effizienter ist.

Ein paar Worte zum Jobsystem. Wir möchten einen sehr einfachen Weg finden, um Multithread-Code zu schreiben. Schreiben Sie gleichzeitig in C #, überprüfen Sie alles für Sie, geben Sie nicht die Möglichkeit, Fehler zu machen oder zu zeigen, warum, wo und wie Sie sie gemacht haben. Wir beschränken die Sprachfunktionen, die Sie in Jobs verwenden können, und nennen diese Teilmenge C # High Performance C #. Sie haben keine Referenzen in Ihrem Jobcode, keine Zeilen, alle Daten müssen kopiert werden - Sie können keine große Anzahl von Sprachfunktionen verwenden, was es viel schwieriger macht, Multithreading in Ihrem Bein aufzunehmen.
Wir präsentieren auch sehr schnelle Sammlungen und die Integration mit ECS. Diese ECS- und Jobsystemstruktur ermöglicht eine sehr schnelle Codeausführung.
Gleichzeitig bieten wir Ihnen nicht nur die Möglichkeit, diese Technologien zu nutzen, sondern arbeiten selbst mit diesen Systemen und erstellen neue APIs, damit sie in Jobs verwendet werden können.

Wir haben Async Raycasts für die Physik erstellt, mit denen Sie sagen können: "Ich möchte 600 Rakecasts, tun Sie es mir bitte eines Tages." Wir arbeiten daran, dass mit diesen Technologien aktuelle Systeme, beispielsweise Animationen, über die Playbles-API erweitert werden können. Und wir denken darüber nach, neue Systeme in Unity zu erstellen, die in C ++ nicht geschlossen werden und deren Code in C # verfügbar und für Sie verfügbar sein wird.

Wenn Sie den Code von Job verwenden, ist dies ziemlich einfach. Job ist eine Struktur, in der es eine Execute-Methode gibt, bei der wir einige Arbeiten ausführen, indem wir diesen Job ausführen. Dementsprechend wird unser interner Scheduler eines Tages verstehen, wo es besser ist, ihn auszuführen, und alle Abhängigkeiten auflösen. Hier erhalten wir einen JobHandle, den wir als Abhängigkeit für einige andere Jobs verwenden können.
Wie im Projekt verwenden? Es ist gut, wenn Sie Jobs von Anfang an verwenden, dies ist hier jedoch nicht erforderlich. Wenn Sie über ein leistungskritisches System verfügen, z. B. Simulation, Pfadfindung, Vernetzung oder etwas anderes, können Sie herausfinden, wie Sie es mit diesem Tool optimieren können.

Dazu müssen Sie jedoch einige wichtige Schritte ausführen und verstehen, wie Daten ordnungsgemäß gespeichert werden. ECS ermöglicht es uns tatsächlich, Daten korrekt zu speichern, da wir die Daten vom Code trennen und unsere Implementierung von ECS die Daten von Komponenten linear im Speicher speichert. Wenn Sie diese Komponenten von einem System durchlaufen, nutzen Sie alle Prozessorfunktionen, alles wird im Cache gespeichert und usw. Wir versuchen es sehr schnell zu machen.
Anschließend teilen Sie diese Arbeit in parallele Aufgaben auf, schreiben den Jobcode und führen ihn aus. Und (wahrscheinlich) funktioniert alles für Sie. Natürlich müssen Sie auf der Zielplattform testen und vor allem testen, abhängig von der Anzahl der Kerne usw. Die Verwendung von Job System und ECS wirkt sich jedoch, wie gesagt, auch stark auf die Planung Ihrer Spielarchitektur aus.
Dann ist alles viel einfacher. Burst Compiler ist unsere einzigartige Technologie, ein spezieller Compiler dieses C # -Subnetzes (High Performance C #) in den Maschinencode der aktuellen Plattform, den Sie in Ihrem Projekt veröffentlichen.

Die Jungs haben etwas Magie gemacht, die wahrscheinlich niemand außer ihnen versteht, aber dieses Ding beschleunigt den Jobcode zehnmal, was super cool ist. Und das Coolste ist, dass Sie keine Aktion benötigen - wenn Sie einen Job-Code haben, fügen Sie einfach das Attribut [BurstCompile] hinzu, Burst kompiliert Ihren Code und Sie erhalten eine „kostenlose“ Leistung. Dies ist unsere neue Technologie und Sie können sie jetzt ausprobieren.

Und das Letzte, was ich kurz erwähnen möchte, ist die Scriptable Render Pipeline (SRP), an der wir schon sehr lange gearbeitet haben und die Ihnen die Möglichkeit geben soll, ein sehr benutzerdefiniertes Rendering für Ihr spezifisches Spiel zu schreiben.

Render Pipeline ist ein Algorithmus, der Culling (welche Objekte gezeichnet werden), Rendering und Nachbearbeitung ausführt. Jetzt haben wir eine Black Box, die Forward oder Deferred - sie sind bereits gut, wir bekommen sehr coole Grafiken auf Handys, auf PCs, auf Konsolen. Sie haben jedoch viele Einschränkungen, da sie nicht erweitert werden können. Mit dieser neuen Funktion, SRP, können Sie Ihre Pipeline schreiben, etwas von dort entfernen, hinzufügen und alles tun, was Sie wollen.

Wir arbeiten derzeit an zwei Beispielen für Pipelines. Ein LWRP, auf das wir auf Mobiltelefonen und schwachen Geräten abzielen, und HDRP, auf das wir auf PCs, Konsolen abzielen und an dem sehr berühmte Leute in der Branche arbeiten. Davor machten sie AAA-Spiele. Sicherlich haben Sie unser Demobuch der Toten gesehen.
Hier haben wir HDRP verwendet, um die volle Leistung dieser Technologie zu zeigen.
Um dies zu nutzen, müssen Sie auch eine ziemlich große Anzahl von heldenhaften Schritten unternehmen, da mit der neuen Pipeline fast nichts mit dem kompatibel ist, was wir jetzt haben. Das heißt, Wenn Sie mit Legacy aktualisieren, bieten wir ein Dienstprogramm an, mit dem die meisten Materialien für Sie aktualisiert werden. Sie müssen jedoch Ihre Shader neu schreiben, d. h. Texturen werden höchstwahrscheinlich anders aussehen.

Sehr cool, wenn Sie von vorne anfangen und mit Ihrer Pipeline experimentieren können. Wenn Sie etwas an Ihrer Pipeline tun möchten, kontaktieren Sie uns bitte.
Verstehe wieder, was du brauchst, denn jetzt hast du mehr Möglichkeiten, etwas zu tun, aber du brauchst Leute, die es können, oder du musst lernen, wie es geht.

Meiner Meinung nach ist das cool, weil diejenigen, die mit diesen neuen Technologien mit uns arbeiten, auf dem Markt gefragter sein werden. Das ist alles, ich hoffe, jemand wird sich diese Technologien ansehen und schöne, coole Spiele machen.
Fragen aus dem Publikum
- Wann kann ich ECS bekommen und entwickeln?- Sie können ECS verwenden. Das Problem besteht darin, dass es in seiner aktuellen Form eher auf Personen ausgerichtet ist, die sich auf Leistung konzentrieren, d. H. eine Art AAA-Projekt. Und die Aufgabe von Unity ist es, Performance by Default für alle verfügbar zu machen. Daher benötigen wir ein bestimmtes System, ein Add-On zu ECS, mit dem wir ECS genauso einfach verwenden können wie jetzt MonoBehavior. Obwohl es kein solches Add-On gibt, glaube ich nicht, dass ECS in einer vollständigen Version veröffentlicht wird. Und es stellt sich heraus, dass wir eine Funktion entwickelt haben, die 1% unserer Benutzer verwenden wird. Und dies ist keine Einheitsaufgabe. Ich kenne Leute, die ECS bereits in der Produktion verwenden. Denken Sie jedoch daran, dass sich diese Funktion noch in der Entwicklung befindet. Jetzt lösen wir die Frage, wie die bequemste Benutzeroberfläche erstellt werden kann. Und die nächste Aufgabe (nicht weniger schwierig) besteht darin, eine API zu erstellen, die auf diesem ECS aufbaut und es Ihnen ermöglicht, sie genauso einfach wie MonoBehaviour zu verwenden. Das heißt, Es gibt keine Antwort auf die Frage „wann genau“.
- ECS und der Rest der Gegenstände konzentrieren sich darauf, ein einfaches GameObject zu nehmen, 150.000 seiner Klone zu erstellen und diese zu verwalten. Aber was ist, wenn ich nur wenige Objekte habe, die aber unterschiedliche Entitäten haben?- Sie können im Prinzip nichts tun, diese Technologie verpflichtet Sie nicht, sie zu verwenden. Wenn Sie mit diesen Technologien eine Leistungssteigerung erzielen können, sollten Sie sie verwenden. Wenn dies für Sie nicht relevant ist, verwenden Sie Unity weiterhin unverändert. Bitte keine Panik.
- Wir haben einen Client unter Unity, einen Server unter .NET, wir haben einen Server unter Unity ausprobiert, es kommt nichts heraus. Gleichzeitig möchte ich aber auch die Technologien von Unity auf dem Server verwenden.
- Wir arbeiten daran und verstehen, dass wir jetzt keine effektive Serverlösung anbieten können. Wir haben die Firma Multiplay vor einiger Zeit gekauft, um qualitativ hochwertiges Hosting für Unity-Spiele zu erstellen. Wir vernetzen uns separat und sind separat bestrebt, die Engine so zu optimieren, dass mehr Dinge herausgeschleudert werden können. Wenn alles zusammenkommt, werden wir dementsprechend eine hervorragende Multiplayer-Lösung haben.
Weitere Gespräche mit Pixonic DevGAMM Talks