Wie die Helden des OverWatch-Spiels einmal kahl wurden und wir ihnen die Haare zurückgaben

    Bild
    Eine der Funktionen von Parallels Desktop 12 für Mac ist die Unterstützung von PC-Spielen. Es gibt viele Spiele, die nur für Windows und Xbox verfügbar sind, und mit Parallels Desktop können Sie diese Spiele auf einem Mac spielen, ohne neu zu starten - in einer virtuellen Maschine. Können wir davon ausgehen, dass das Problem der PC-Spiele auf dem Mac vollständig gelöst ist? Noch nicht, aber wir arbeiten daran. Dieser Artikel beschreibt einige Beispiele dafür.

    Warum es schwierig ist, DirectX vollständig zu unterstützen


    Tatsächlich garantiert die virtuelle PC-Maschine, mit der Sie Windows auf einem Mac ausführen können, nicht, dass PC-Spiele darin funktionieren. Tatsache ist, dass die meisten Spiele DirectX-Unterstützung für eine bestimmte Version seitens des Videoadapters benötigen und die Bereitstellung dieser Unterstützung vollständig bei den Entwicklern von Videotreibern liegt. Natürlich funktionieren Videotreiber, die für die „echten“ Nvidia-, AMD- und Intel-Grafikkarten entwickelt wurden, in einer virtuellen Maschine nicht.

    Derzeit ist die neueste Version von DirectX DirectX 12, sie ist jedoch noch nicht weit verbreitet. Eine andere Sache ist die Version von DirectX 11, die bei Spieleentwicklern bereits sehr beliebt ist. Ab DirectX 10 gibt es zwar die Möglichkeit, mit DirectX Version 11 und höher auf einer Grafikkarte zu arbeiten, die beispielsweise nur DirectX 10 mit eingeschränkter Funktionalität unterstützt, sodass die meisten neuen Spiele, die für DirectX 11 geschrieben wurden, ausgeführt werden können DirectX 10 ohne erkennbaren visuellen Unterschied.



    Wir bieten seit den ersten Versionen von Parallels Desktop für Mac DirectX-Unterstützung. Mit der Entwicklung von Windows und DirectX hat sich auch Parallels Desktop weiterentwickelt. Wir unterstützen seit einigen Jahren DirectX 7, DirectX 8, DirectX 9 und DirectX 10, was vor diesem Hintergrund besonders wichtig ist. Der Teil der DirectX 10-Funktionalität, der den Betrieb eines Videotreibers betrifft - die Regeln, nach denen seine Befehle interpretiert und ein Image erstellt werden müssen - wird in der Dokumentation ziemlich kurz beschrieben. Die Anzahl der verschiedenen Kombinationen, Zustände und Aufrufe ist sehr groß, und es ist leider unrealistisch, nur die Spezifikation zu lesen, um einen eindeutigen Programmcode dafür zu erstellen, mit dem jedes PC-Spiel ausgeführt und funktioniert werden kann.

    Darüber hinaus sollten Sie sich bewusst sein, dass wir DirectX 10-Unterstützung über OpenGL anbieten, d. H. Konvertieren Sie DirectX-Befehle in OpenGL-Befehle. Das gleiche Design in OpenGL und DirectX kann jedoch auf leicht unterschiedliche Weise funktionieren, und verschiedene Bilder können unter verschiedenen Bedingungen gezeichnet werden. Was bleibt? Es bleibt durch Versuch und Irrtum zu arbeiten, d.h. Starten Sie moderne Spiele, die DirectX 10-Funktionen verwenden und Fehler beheben.

    Unser Kampf mit Overwatch


    Wir haben uns entschlossen, unsere Unterstützung für DirectX 10 am Beispiel des Overwatch- Spiels zu testen , eines von Blizzard Entertainment für alle wichtigen Spielplattformen veröffentlichten Mehrspieler-Shooters, d. H. für PC, PS4 und Xbox One - aber nicht für Mac. Overwatch nutzt DirectX 10 sehr intensiv, so dass es sich für unseren DX10-Treiber als guter Festigkeitstest herausstellte. Und das Spiel hat funktioniert - aber mit vielen Problemen. Viele Dinge wurden langsam falsch gezeichnet. So sah das Spiel zuerst aus.



    Im Folgenden beschreiben wir nur drei der Probleme, mit denen wir konfrontiert waren .

    Steuerelemente und Menüelemente


    Das erste, was uns auffiel, war, dass das Overwatch-Spiel auf den NVidia- und Intel-Grafikkarten keinen Teil der Menüpunkte, Indikatoren und Symbole zeichnete. Wir haben das Problem ziemlich schnell gefunden - es stellte sich heraus, dass es mit der Diskrepanz bei der Interpretation der Werte der in Vertex-Shadern integrierten VertexID-Variablen zusammenhängt. Beim Index-Rendering in DirectX entspricht diese Variable dem Wert „Vertex-Index“, und bei der Arbeit über OpenGL wird der Wert BaseVertex weiterhin hinzugefügt. Die texturerzeugenden Shader, die dann zum Anzeigen von Menüs und anderen „flachen“ Spielelementen verwendet werden, verwenden VertexID im Vergleich zu vordefinierten Werten in ihrem Code. Da die Treiber für NVidia und Intel gemäß der OpenGL-Spezifikation arbeiten, liefern sie das falsche Bild. Im Gegensatz dazu fügen Treiber für AMD BaseVertex nicht zu VertexID hinzu.

    Es wäre möglich, die Situation mit der Erweiterung GL_ARB_shader_draw_parameters einfach zu beheben , aber der Mac unterstützt sie leider nicht - zumindest vorerst . Wir haben eine andere Lösung gefunden: Bei Verwendung von NVidia- und Intel-Grafikkarten übergeben wir den BaseVertex-Wert im Shader und subtrahieren ihn dann von gl_VertexId. Das Ergebnis ist ein variabler Wert, der in Bezug auf DirectX 10-Zahlen korrekt ist. Bei AMD-Grafikkarten ist dies natürlich nicht der Fall.

    Problem mit Schatten


    Tatsächlich wurden die Schatten von Objekten in Overwatch korrekt gezeichnet. In allen beleuchteten Bereichen waren jedoch Streifen erkennbar.



    Nachdem wir uns gründlich mit den Shadern befasst hatten, wurde der Grund für die Festlegung des Status von OpenGL gefunden. Die RasterizerState-Funktion der Direct3D 10 Runtime-Komponente verfügt über drei Werte, die die Anpassung der Tiefe der Polygone angeben: DepthBias, DepthBiasClamp und SlopeScaledDepthBias. Ihr Gegenstück in OpenGL läuft darauf hinaus, glPolygonOffset mit den richtigen Parametern aufzurufen, und unser Fehler war, dass wir bei einem DepthBias-Wert von Null nicht davon ausgegangen sind, dass SlopeScaledDepthBias ungleich Null ist, da wir dachten, dass die Korrektur der Tiefe der Polygone in diesem Fall deaktiviert ist.

    Warum fallen Haare aus?


    Die Tatsache, dass alle Charaktere des Overwatch-Spiels unter Parallels Desktop entweder ihre Haare vollständig verloren oder ihre Haare „wie ein Igel“ geschnitten haben, löste eine starke Reaktion in den sozialen Netzwerken aus und erzeugte viele Witze .



    Es ist jedoch erwähnenswert, dass gutmütige Benutzer beim "Zurückziehen" kahler Helden nicht bemerkt haben, dass dem Spiel nicht nur die Haare der Charaktere, sondern auch einige andere Objekte fehlen. Tests haben gezeigt, dass die Ursache für diesen exotischen Fehler das Fehlen freier Texturkanäle ist. In OpenGL dürfen für jeden Shader-Typ nicht mehr als 16 vorhanden sein. Diese Einschränkung war auf die Tatsache zurückzuführen, dass die Verwendung von Texturkanälen mit den Nummern 16 und höher auf AMD-Grafikkarten zu einer Beschädigung des OpenGL-Status im Treiber und zu Problemen beim nachfolgenden Rendern führt. Infolgedessen erhielt der Shader anstelle aller anderen beim Rendern beteiligten Texturen eine schwarze Farbe, was in einigen Fällen zum vollständigen Verschwinden des gezeichneten Objekts aus der Szene führte. Ich muss sagen, dass wir das Problem selbst natürlich nicht beseitigt haben, Da jedoch in Overwatch der negative Effekt der Aufhebung dieser Einschränkung minimal war, haben wir beschlossen, sie in diesem Fall zu beseitigen. Es ist erwähnenswert, dass im allgemeinen Fall das Problem eines Mangels an Texturkanälen in OpenGL im Vergleich zu DirectX 10 akut ist, weil Letzteres ermöglicht theoretisch die Verwendung von bis zu 128 Ressourcen in einem Rendering und spart nur, dass nur sehr wenige Anwendungen diese Funktion verwenden.

    Ergebnis


    Die ganze Arbeit dauerte weniger als einen Monat, und nachdem wir die beschriebenen und einige andere Fehler korrigiert hatten, stellten wir sicher, dass unsere Benutzer jetzt tatsächlich Overwatch unter Parallels Desktop für Mac spielen können, und dieses Spiel funktioniert in der Virtualisierung ziemlich schnell. Diese Geschwindigkeit ist natürlich nicht mit der Geschwindigkeit von Overwatch auf dem PC vergleichbar, und bei ernsthaften Belastungen verlangsamt sich das Spiel. Das Ziel, „den PC einzuholen und zu überholen“, wurde von uns jedoch nicht gesetzt. Anhand des Overwatch-Beispiels haben wir Probleme beim Betrieb unseres virtuellen Treibers festgestellt und konnten diese beheben. Die erzielten Ergebnisse unterstützen die Arbeit anderer 3D-Anwendungen. Und natürlich ist nichts mit dem positiven Feedback von Mac-Benutzern zu vergleichen - denn dank uns können sie jetzt ihre alten Lieblingsspiele auf dieser Plattform spielen und sie auf den Mac übertragen, ohne dass jemals jemand verwirrt wäre.



    Wann wird die DirectX 11-Unterstützung angezeigt?


    Tatsache ist, dass sich OpenGL auf Macs langsam entwickelt und immer merklich hinter den neuesten Versionen zurückbleibt. Selbst um DirectX 10 zu unterstützen, fehlte uns häufig die vorhandene OpenGL-Funktionalität auf dem Mac. Wir mussten auf verschiedene Tricks zurückgreifen und die fehlenden Funktionen selbst emulieren. Jetzt unterstützt der Mac OpenGL 4.1 und dies ist irgendwie genug für DirectX 10, aber für die 11. Version gibt es eine Reihe von Schlüsselfunktionen, zum Beispiel Compute Shader. Viel hängt also davon ab, ob Apple OpenGL auf seinen Computern weiterentwickeln wird.

    Jetzt auch beliebt: