{"id":204798,"date":"2021-11-17T13:22:00","date_gmt":"2021-11-17T12:22:00","guid":{"rendered":"https:\/\/blog.jetbrains.com\/dotnet\/2021\/11\/09\/wargaming-uses-rider-for-unreal-engine-to-develop-its-new-game\/"},"modified":"2021-11-24T10:32:50","modified_gmt":"2021-11-24T09:32:50","slug":"wargaming-uses-rider-for-unreal-engine-to-develop-its-new-game","status":"publish","type":"dotnet","link":"https:\/\/blog.jetbrains.com\/de\/dotnet\/2021\/11\/17\/wargaming-uses-rider-for-unreal-engine-to-develop-its-new-game\/","title":{"rendered":"Wargaming entwickelt neues Spiel mit Rider for Unreal Engine"},"content":{"rendered":"\n<p>Seit anderthalb Jahren ist unser Early-Access-Programm f\u00fcr <a href=\"https:\/\/www.jetbrains.com\/lp\/rider-unreal\/\" target=\"_blank\" rel=\"noopener\">Rider for Unreal Engine<\/a> aktiv. Diese neue IDE erm\u00f6glicht die Entwicklung von Spielen in C++ unter Verwendung der Unreal Engine. Zehntausende Indie-Spieleentwickler*innen sowie zahlreiche Entwicklerstudios und Unternehmen aller Gr\u00f6\u00dfen nehmen inzwischen am Programm teil. Wir wollten gerne erfahren, was sie an dem Produkt am meisten sch\u00e4tzen, was ihnen daran gef\u00e4llt und was sie vielleicht noch vermissen. Dazu baten wir um ein Gespr\u00e4ch mit Viacheslav Dubikovsky, Technical Director bei Wargaming RED, einem Entwicklerstudio, das k\u00fcrzlich in Moskau als Teil der Wargaming Group Limited gegr\u00fcndet wurde. Das Interview f\u00fchrten Anastasia Kazakova, Product Marketing Manager f\u00fcr .NET- und C++-Tools, und Alexander Pirogov, Project Manager f\u00fcr Rider for Unreal Engine.<\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                                                            <div class=\"about-author__box-img\">\n                            <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/11\/speaker_photo.jpg\" alt=\"\" loading=\"lazy\">\n                        <\/div>\n                                        <div class=\"about-author__box-text\">\n                                                    <h4>Viacheslav Dubikovsky<\/h4>\n                                                <p>Technical Director bei Wargaming RED<\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/div>\n\n\n<p><strong><em>Hallo Viacheslav! K\u00f6nnten Sie uns etwas \u00fcber das Projekt erz\u00e4hlen, an dem Sie gerade arbeiten? Um was f\u00fcr ein Spiel handelt es sich?<\/em><\/strong><\/p>\n<p>Wir haben den Titel noch nicht bekannt gegeben, daher kann ich Ihnen aufgrund von NDAs nicht viel dazu sagen. Was ich verraten kann: Es handelt sich um einen Session-basierten Third-Person-Sci-Fi-Shooter.<\/p>\n<p><strong><em>Und Sie verwenden Unreal als Game-Engine?<\/em><\/strong><\/p>\n<p>So ist es. Wir entwickeln das Spiel in C++ und verwenden derzeit Unreal Engine 4.26, sind jedoch dabei, nach und nach auf 4.27 zu migrieren. Ich glaube nicht, dass wir dieses Projekt auf Unreal Engine 5 umstellen werden, da diese Version ein anderes Rendering verwendet und bei einer Migration m\u00f6glicherweise alle bereits erstellten Spielgrafiken neu erstellt werden m\u00fcssten.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/11\/wg.jpg\" alt=\"WG team\" width=\"750\"><\/p>\n<p><strong><em>Wie ist das Projekt strukturiert? Welche Technologien verwenden Sie?<\/em><\/strong><\/p>\n<p>Wie gesagt wird das Projekt in C++ entwickelt und baut auf der Unreal Engine auf. Wir machen intensiven Gebrauch vom Reflexionsmechanismus der Unreal Engine sowie von der Metaprogrammierung mithilfe von C++-Templates. Wir haben zwei Mono-Repositories, eines f\u00fcr das Spiel selbst und eines f\u00fcr die Engine. Die zentrale Spiellogik wird im gemeinsamen Modul gespeichert.<\/p>\n<p>Bei der Verwendung von Code-Editoren stellt der UE-Reflexionsmechanismus in der Regel die gr\u00f6\u00dfte Herausforderung dar. Es ist schwierig, mit Code zu arbeiten, der von so vielen Makrodefinitionen umgeben ist, die vom sprachlichen Standpunkt aus praktisch bedeutungslos sind. Damit k\u00f6nnen nur die wenigsten Entwickler*innen etwas anfangen. Und genau hier bringt uns Rider for Unreal Engine die Rettung!<\/p>\n<p><strong><em>Wie viele Entwickler*innen sind am Projekt beteiligt? Was sind die wichtigsten Tools, die sie verwenden? <\/em><\/strong><\/p>\n<p>Unser Team besteht aus etwa 25 Programmierer*innen. Ein Drittel von ihnen verwendet Rider for UE, und die anderen arbeiten mit verschiedenen Visual-Studio-Versionen. Vor der Einf\u00fchrung von Rider hatten wir Visual Studio verwendet, entweder pur oder in Kombination mit Visual Assist oder ReSharper C++. Aber der VS-Editor hatte oft Leistungsprobleme, egal ob mit oder ohne Plugins. Bei Visual Assist waren uns die Sprachfunktionen nicht genau genug (vielleicht hat sich das inzwischen ge\u00e4ndert). Rider for Unreal Engine hingegen hat eine hervorragende Leistung gezeigt, zumindest im Umgang mit UE-Code.<\/p>\n<p><strong><em>War die Migration zu Rider for Unreal Engine einfach f\u00fcr Sie? <\/em><\/strong><\/p>\n<p>Mein erster Eindruck war: \u201eWow, die VS-Tastenk\u00fcrzel werden unterst\u00fctzt! Ich kann meine VS-Kenntnisse einsetzen.\u201c In Bezug auf die Benutzeroberfl\u00e4che scheint Visual Studio in einigen Aspekten benutzerfreundlicher zu sein, z. B. beim Debuggen \u2013 wahrscheinlich habe ich einfach nur mehr Erfahrung damit. Aber die Benutzeroberfl\u00e4che von Rider ist optisch sehr ansprechend, das muss ich zugeben.<\/p>\n<p>Trotzdem kann es schwierig sein, von einem seit Jahren verwendeten Tool zu einem anderen zu wechseln, sodass einige unserer Kolleg*innen bei Visual Studio geblieben sind.<\/p>\n<p><strong><em>Welche Funktionen von Rider for Unreal Engine waren in Ihrem Projekt bisher am n\u00fctzlichsten?<\/em><\/strong><\/p>\n<p>Das w\u00e4ren die Navigation, die Verwendungssuche, das Springen zu Symboldeklarationen, zu abgeleiteten und Basissymbolen \u2013 wir verwenden diese st\u00e4ndig, sowohl in unserem eigenen Code als auch im Unreal-Engine-Code (da der Engine-Code die Hauptdokumentationsquelle f\u00fcr die Entwickler*innen darstellt). Ein weiterer Schl\u00fcssel zur effektiven Nutzung der Unreal Engine besteht darin, Links zu Feldern und Funktionen schnell zu finden und durch den Code zu navigieren \u2013 und Rider for Unreal Engine ist besonders gut darin.<\/p>\n<p>Dann gibt es noch die statische Codeanalyse \u2013 Inspektionen, die auf Fehler im Code hinweisen. Wenn wir die Fehler direkt im Editor erkennen, noch vor dem Kompilieren, spart das viel Zeit. Wenn solche Fehler die Kompilierungsstufe erreichen, kann es zu einem stundenlangen \u201ePingpong\u201c zwischen Compiler und Entwickler kommen. Nat\u00fcrlich finden wir auf diese Weise nicht alle Fehler, insbesondere bei Code, der Templates verwendet. Die Unreal Engine selbst verwendet jedoch kaum Templates, sodass nur ein kleiner Prozentsatz an Fehlern \u00fcbrig bleibt, der gefunden und behoben werden muss. Inspektionen, die das automatische Hinzuf\u00fcgen von fehlenden <code>include<\/code>-Direktiven anbieten, helfen ebenfalls, Zeit zu sparen: Dank Rider m\u00fcssen wir nicht mehr \u00fcberlegen, welche Header-Dateien inkludiert sind und welche nicht.<\/p>\n<p>Erstaunlich ist auch, dass Rider den in Unreal Engine implementierten Reflexionsmechanismus kennt und Reflexionsbezeichner und Makros automatisch vervollst\u00e4ndigen kann. Normalerweise merkt man sich solche Dinge nicht, sodass die Hinweise von Rider das Programmieren wirklich beschleunigen k\u00f6nnen.<\/p>\n<p>Zu erw\u00e4hnen ist auch das Parsen von Assets und das Binding von Blueprints mit C++-Quellcode. Diese Funktion wird nicht allzu oft verwendet, aber wenn doch, dann ist sie sehr n\u00fctzlich. Insbesondere wenn sich beim Refactoring etwas im C++-Quellcode \u00e4ndert, ist es sehr n\u00fctzlich, die Verwendungen in Blueprints zu sehen. Gleiches gilt f\u00fcr INI-Konfigurationsdateien und Standardwerte f\u00fcr Klasseneigenschaften: Oft sind die Werte direkt im Code zu sehen, ohne in den INI-Dateien nach ihnen suchen zu m\u00fcssen.<\/p>\n<p>Nicht zuletzt ist noch die Integration mit dem Unreal Editor zu erw\u00e4hnen, also die Plugins RiderLink\/UnrealLink. Normalerweise starten wir den Unreal Editor aus dem Rider-Debugger, um live darin zu programmieren. Die M\u00f6glichkeit, Protokolle direkt in Rider einzusehen, w\u00e4hrend wir das Spiel pausieren und fortsetzen, bietet manchmal einen echten Geschwindigkeitsschub. Wenn wir beispielsweise Plugins von Drittanbietern verwenden (f\u00fcr die Integration mit Steam oder externen Chats, f\u00fcr die Erstellung der Game-Pipeline usw.), m\u00fcssen wir nicht einmal zum Editor wechseln \u2013 es gen\u00fcgt, die Protokolle zu sehen und den Editor anzuhalten\/fortzusetzen.<\/p>\n<p>Da wir gerade beim Thema sind, h\u00e4tte ich einige Verbesserungsvorschl\u00e4ge in Bezug auf das Unreal-Protokoll:<\/p>\n<ul>\n<li>F\u00fcgen Sie weitere Filteroptionen hinzu. Es gibt Unmengen von Protokollen, manchmal Hunderte oder mehr, daher kann es schwierig sein, die richtigen Kategorien auszuw\u00e4hlen.<\/li>\n<li>Mehrere Suchergebnisse sollten im Protokoll gleichzeitig markiert werden \u2013 dies ist ein sehr h\u00e4ufiger Anwendungsfall.<\/li>\n<\/ul>\n<p><strong><em>Vielen Dank f\u00fcr diese Ideen! Wie verh\u00e4lt es sich mit dem Debugger von Rider \u2013 verwenden Sie ihn?<\/em><\/strong><\/p>\n<p>Sicher. Ohne Debugger kann sich kein Editor als echtes Entwicklungstool bezeichnen! Vor einiger Zeit hatten wir ein paar Probleme damit, dass der Debugger von Rider nicht an Haltepunkten stoppen wollte, aber das scheint behoben worden zu sein. Die Debugging-Funktion, die wir am h\u00e4ufigsten verwenden, ist definitiv die schrittweise Ausf\u00fchrung des Codes. Manchmal verwenden wir auch bedingte Haltepunkte. Und es gef\u00e4llt uns, wie der Debugger den Inhalt von Unreal-Engine-Objekten anzeigt.<\/p>\n<p><strong><em>Debuggen Sie haupts\u00e4chlich auf dem Desktop?<\/em><\/strong><\/p>\n<p>Bis jetzt schon. Wir wollen in Zukunft mit Konsolen arbeiten, aber wir sind noch nicht soweit.<\/p>\n<p><strong><em>Hinweis: Rider erm\u00f6glicht noch kein Debugging auf Konsolen. Aber wir sind bereits in Gespr\u00e4chen mit den gro\u00dfen Konsolenherstellern. Leider k\u00f6nnen diese Prozesse sehr zeitaufwendig sein, und es gibt bisweilen eine Reihe von b\u00fcrokratischen H\u00fcrden zu \u00fcberwinden.<\/em><\/strong><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/11\/wg_black.jpg\" alt=\"WG brand\" width=\"750\"><\/p>\n<p><strong><em>Wir wollten auch auf Versionsverwaltungen zu sprechen kommen. Welche verwenden Sie?<\/em><\/strong><\/p>\n<p>Wir nutzen haupts\u00e4chlich Git. Neue Funktionen werden aktiv in Branches entwickelt. Wir verwenden die Git-Integration von Rider. F\u00fcr das Rebasing nutzen wir jedoch den Tortoise-Client, da wir damit das Gesamtbild besser \u00fcberblicken k\u00f6nnen. Rebasing ist wahrscheinlich der komplizierteste Git-Vorgang. Wir haben versucht, es zu automatisieren und die Verwendung zu vereinfachen, aber bisher ohne Erfolg.<\/p>\n<p>In einigen anderen Projekten habe ich auch mit Perforce und PlasticSCM gearbeitet.<\/p>\n<p><strong><em>Profilen Sie Ihren Code? Wenn ja, verwenden Sie Profiling-Tools von Drittanbietern?<\/em><\/strong><\/p>\n<p>Ja, wir analysieren unseren Code mit <a href=\"https:\/\/docs.unrealengine.com\/4.26\/en-US\/TestingAndOptimization\/PerformanceAndProfiling\/UnrealInsights\/\" target=\"_blank\" rel=\"noopener\">Unreal Insights<\/a>. Wenn es um die Erfassung von Profiling-Daten geht, ist das native UE-Tool kaum zu schlagen. Aber in Sachen Visualisierung w\u00e4ren Verbesserungen durchaus m\u00f6glich. Wir nutzen unser eigenes Tool, um CPU-Auslastungsdiagramme zu zeichnen. Unreal Insight ist perfekt, um Frame-Inhalte zu untersuchen, aber es hilft uns nicht dabei, die gesamte Dynamik zu sehen \u2013 deshalb haben wir uns entschieden, unser eigenes Tool zu entwickeln.<\/p>\n<p><strong><em>Vielen Dank f\u00fcr dieses Gespr\u00e4ch, Viacheslav. Viel Erfolg bei Ihrem Game-Projekt!<\/em><\/strong><\/p>\n<p><strong><em>Wir freuen uns weiterhin auf Ihre Ideen zur Verbesserung von Rider for Unreal Engine.<\/em><\/strong><\/p>\n\n\n\n<p>Autorin des Original-Blogposts:<\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1132,"featured_media":200725,"comment_status":"closed","ping_status":"closed","template":"","categories":[15,89],"tags":[23,2095,6809],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/dotnet\/204798"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/dotnet"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/types\/dotnet"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/users\/1132"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/comments?post=204798"}],"version-history":[{"count":3,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/dotnet\/204798\/revisions"}],"predecessor-version":[{"id":204861,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/dotnet\/204798\/revisions\/204861"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/200725"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=204798"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=204798"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=204798"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=204798"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}