Behebung des Mass Effect-Grafikfehlers auf modernen AMD-Prozessoren

Bild


Einführung



Mass Effect ist ein beliebtes Sci-Fi-RPG-Franchise. Der erste Teil wurde erstmals Ende 2007 von BioWare exklusiv für die Xbox 360 im Rahmen einer Vereinbarung mit Microsoft veröffentlicht. Einige Monate später, Mitte 2008, erhielt das Spiel einen von Demiurge Studios entwickelten PC-Port. Der Port war anständig und hatte keine erkennbaren Mängel, bis AMD 2011 seine neuen Prozessoren mit Bulldozer-Architektur herausbrachte. Beim Starten eines Spiels auf einem PC mit modernen AMD-Prozessoren an zwei Spielorten (Noveria und Ilos) treten schwerwiegende grafische Artefakte auf:





Ja, es sieht hässlich aus.



Dies macht das Spiel zwar nicht unspielbar, aber diese Artefakte sind ärgerlich. Glücklicherweise gibt es eine Lösung, zum Beispiel können Sie die Beleuchtung mit Konsolenbefehlen ausschalten oder die Spielkarten ändern, um defekte Lichter zu entfernen , aber es scheint, dass niemand die Ursache dieses Problems jemals vollständig verstanden hat. Einige Quellen behaupten, dass der FPS Counter Mod dieses Problem ebenfalls behebt, aber ich konnte keine Informationen darüber finden: Der Quellcode des Mods scheint nicht online veröffentlicht zu sein, und es gibt keine Dokumentation darüber, wie der Mod den Fehler behebt.



Warum ist dieses Problem so interessant? Fehler, die nur auf Hardware bestimmter Hersteller auftreten, sind weit verbreitet und treten seit vielen Jahrzehnten in Spielen auf. Nach meinen Informationen ist dies jedoch der einzige Fall, in dem das Grafikproblem vom Prozessor und nicht von der Grafikkarte verursacht wird. In den meisten Fällen treten Probleme mit Produkten eines bestimmten GPU-Herstellers auf und wirken sich in keiner Weise auf die CPU aus. In diesem Fall ist das Gegenteil der Fall. Daher ist dieser Fehler eindeutig und daher eine Untersuchung wert.



Nachdem ich Online-Diskussionen gelesen habe, bin ich zu dem Schluss gekommen, dass das Problem bei AMD FX- und Ryzen-Chips zu liegen scheint. Im Gegensatz zu älteren AMD-Prozessoren fehlt diesen Chips der 3DNow! -Anweisungssatz! ... Vielleicht hat der Fehler nichts damit zu tun, aber im Allgemeinen besteht in der Spielergemeinschaft Einigkeit darüber, dass dies die Ursache des Fehlers ist und dass das Spiel versucht, diese Befehle zu verwenden, wenn es einen AMD-Prozessor findet. In Anbetracht dessen, dass auf Intel-Prozessoren keine Fälle dieses Fehlers bekannt sind und dass 3DNow! Nur AMD verwendet, kein Wunder, dass die Community diesen Befehlssatz als Grund beschuldigte.



Aber sind sie das Problem oder verursacht etwas völlig anderes den Fehler? Lass es uns herausfinden!



Teil 1 - Forschung



Auftakt



Obwohl es extrem einfach ist, dieses Problem neu zu erstellen, konnte ich es lange Zeit aus dem einfachen Grund nicht bewerten - ich hatte keinen PC mit einem AMD-Prozessor zur Hand! Glücklicherweise mache ich diesmal nicht meine Recherchen alleine - Rafael Rivera unterstützte mich durch die Studie, indem er eine Testumgebung mit einem AMD-Chip bereitstellte, und teilte auch seine Annahmen und Gedanken mit, während ich blinde Vermutungen anstellte, wie dies normalerweise bei der Suche der Fall ist Quellen solcher unbekannter Probleme.



Da wir jetzt eine Testumgebung hatten, haben wir natürlich zuerst die Theorie getestetcpuid- Wenn die Leute zu Recht davon ausgehen, dass 3DNow! -Teams schuld sind, sollte im Spielcode ein Platz vorhanden sein, der ihre Anwesenheit überprüft oder zumindest den Hersteller der CPU identifiziert. Es gibt jedoch einen Fehler in dieser Argumentation; wenn das Spiel wirklich versucht hat, 3DNow zu verwenden! Auf jedem AMD-Chip, ohne die Möglichkeit seiner Unterstützung zu prüfen, stürzt er höchstwahrscheinlich ab, wenn versucht wird, einen ungültigen Befehl auszuführen. Darüber hinaus zeigt eine kurze Untersuchung des Spielcodes, dass die Fähigkeiten der CPU nicht getestet werden . Unabhängig von der Fehlerursache scheint dies nicht auf eine falsche Identifizierung der Prozessorfunktionalität zurückzuführen zu sein, da das Spiel überhaupt nicht daran interessiert ist.



Als der Fall unmöglich zu debuggen schien, informierte mich Raphael über seine Entdeckung - die Deaktivierung von PSGP(Prozessorspezifische Grafik-Pipeline) behebt das Problem und alle Zeichen leuchten ordnungsgemäß! PSGP ist nicht das am umfassendsten dokumentierte Konzept. Kurz gesagt, dies ist eine Legacy-Funktion (nur für ältere Versionen von DirectX), mit der Direct3D Optimierungen für bestimmte Prozessoren durchführen kann:



In früheren Versionen von DirectX gab es einen Code-Ausführungspfad namens PSGP, der die Vertex-Verarbeitung ermöglichte. Anwendungen mussten diesen Pfad berücksichtigen und einen Pfad für die Vertex-Verarbeitung durch den Prozessor und die Grafikkerne beibehalten.


Bei diesem Ansatz ist es logisch, dass durch Deaktivieren von PSGP Artefakte auf AMD beseitigt werden - der von modernen AMD-Prozessoren gewählte Pfad war irgendwie fehlerhaft. Wie kann ich es deaktivieren? Zwei Möglichkeiten kommen in den Sinn:



  • Sie können der Funktion ein IDirect3D9::CreateDeviceFlag übergeben D3DCREATE_DISABLE_PSGP_THREADING. Es wird wie folgt beschrieben:



    . , (worker thread), .


    , . , «PSGP», , .
  • DirectX PSGP D3D PSGP D3DX – DisablePSGP DisableD3DXPSGP. . . Direct3D .


Es scheint in der DisableD3DXPSGPLage zu sein, dieses Problem zu lösen. Wenn Sie keine Fixes / Modifikationen von Drittanbietern herunterladen möchten oder das Problem beheben möchten, ohne Änderungen am Spiel vorzunehmen, ist dies eine vollständig funktionierende Methode. Wenn Sie dieses Flag nur für Mass Effect und nicht für das gesamte System setzen, ist alles in Ordnung!



PIX



Wenn Sie Probleme mit der Grafik haben, hilft dies wie üblich höchstwahrscheinlich bei der Diagnose des PIX. Wir haben ähnliche Szenen auf Intel- und AMD-Hardware aufgenommen und dann die Ergebnisse verglichen. Ein Unterschied fiel mir sofort auf - im Gegensatz zu meinen vorherigen Projekten, bei denen die Captures keinen Fehler aufzeichneten und dasselbe Capture auf verschiedenen PCs unterschiedlich aussehen konnte (was auf einen Treiberfehler oder d3d9.dll hinweist), sind diese Captures schrieb einen Fehler auf! Mit anderen Worten, wenn Sie eine Aufnahme gemacht auf AMD - Hardware auf einem PC mit einem Intel - Prozessor zu öffnen, der Fehler wird angezeigt.



Die Aufnahme von AMD zu Intel sieht genauso aus wie auf der Hardware, auf der sie aufgenommen wurde:





Was sagt uns das?



  • PIX « », D3D , , Intel , AMD .
  • , , ( GPU ), , .


Mit anderen Worten, dies ist mit ziemlicher Sicherheit kein Treiberfehler. Es sieht so aus, als ob die eingehenden GPU-vorbereiteten Daten auf irgendeine Weise beschädigt sind 1 . Dies ist in der Tat ein sehr seltener Fall!



In diesem Stadium müssen alle Diskrepanzen zwischen den Erfassungen gefunden werden, um den Fehler zu finden. Es ist langweilige Arbeit, aber es gibt keinen anderen Weg.



Nach einer langen Untersuchung der erfassten Daten wurde meine Aufmerksamkeit auf den Aufruf gelenkt, den gesamten Charakterkörper zu zeichnen:





Bei der Übernahme von Intel gibt dieser Aufruf den größten Teil des Körpers des Charakters zusammen mit Beleuchtung und Texturen aus. Bei AMD wird ein festes schwarzes Modell ausgegeben. Sieht so aus, als hätten wir den richtigen Weg gefunden.



Der erste offensichtliche Kandidat für die Überprüfung sind die entsprechenden Texturen, aber sie scheinen in Ordnung zu sein und sind in beiden Aufnahmen gleich. Einige Pixel-Shader-Konstanten sehen jedoch seltsam aus. Sie enthalten nicht nur NaN (Not a Number), sondern sind auch nur in der AMD-Erfassung enthalten:





1. # QO steht für NaN



Sieht vielversprechend aus - NaN-Werte verursachen oft seltsame grafische Artefakte. Lustigerweise hatte die PlayStation 3-Version von Mass Effect 2 ein sehr ähnliches Problem im RPCS3-Emulator , das auch mit NaN zusammenhängt!



Seien Sie jedoch vorerst nicht zu glücklich - dies können Werte sein, die von früheren Anrufen übrig geblieben sind und im aktuellen nicht verwendet werden. Glücklicherweise ist in unserem Fall klar, dass diese NaNs für dieses spezielle Rendering an D3D übergeben werden ...



49652	IDirect3DDevice9::SetVertexShaderConstantF(230, 0x3017FC90, 4)
49653	IDirect3DDevice9::SetVertexShaderConstantF(234, 0x3017FCD0, 3)
49654	IDirect3DDevice9::SetPixelShaderConstantF(10, 0x3017F9D4, 1) // Submits constant c10
49655	IDirect3DDevice9::SetPixelShaderConstantF(11, 0x3017F9C4, 1) // Submits constant c11
49656	IDirect3DDevice9::SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID)
49657	IDirect3DDevice9::SetRenderState(D3DRS_CULLMODE, D3DCULL_CW)
49658	IDirect3DDevice9::SetRenderState(D3DRS_DEPTHBIAS, 0.000f)
49659	IDirect3DDevice9::SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, 0.000f)
49660	IDirect3DDevice9::TestCooperativeLevel()
49661	IDirect3DDevice9::SetIndices(0x296A5770)
49662	IDirect3DDevice9::DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 2225, 0, 3484) // Draws the character model


... und der in diesem Rendering verwendete Pixel-Shader bezieht sich auf beide Konstanten:



// Registers:
//
//   Name                     Reg   Size
//   ------------------------ ----- ----
//   UpperSkyColor            c10      1
//   LowerSkyColor            c11      1


Es sieht so aus, als ob beide Konstanten direkt von der Unreal Engine übernommen wurden und, wie der Name schon sagt, die Beleuchtung beeinflussen können. Bingo!



Der In-Game-Test bestätigt unsere Theorie: Auf einem Intel-Computer wird ein Vektor mit vier NaN-Werten niemals als Pixel-Shader-Konstanten übergeben. Auf einem AMD-Computer werden jedoch NaN-Werte angezeigt, sobald der Spieler die Stelle betritt, an der die Beleuchtung unterbrochen wird!



Bedeutet das, dass die Arbeit erledigt ist? Weit davon entfernt, denn gebrochene Konstanten zu finden ist nur die halbe Miete. Es bleibt die Frage: Woher kommen sie und können sie ersetzt werden? Im In-Game-Test wurde das Problem durch Ändern der NaN-Werte teilweise behoben - die hässlichen schwarzen Flecken waren verschwunden, aber die Charaktere sehen immer noch zu dunkel aus:





Fast richtig ... aber nicht ganz.



Angesichts der Bedeutung dieser Beleuchtungswerte für eine Szene können wir bei dieser Lösung nicht aufhören. Wir wissen jedoch, dass wir auf dem richtigen Weg sind!



Leider deuteten alle Versuche, die Quellen dieser Konstanten zu verfolgen, auf etwas hin, das wie ein Render-Stream aussah, nicht auf das eigentliche Ziel. Während das Debuggen möglich ist, ist es klar, dass wir einen neuen Ansatz ausprobieren müssen, bevor wir möglicherweise unendlich viel Zeit damit verbringen, Datenflüsse zwischen In-Game- und / oder UE3-bezogenen Strukturen zu verfolgen.



Teil 2 - D3DX genauer betrachten



Als wir einen Schritt zurücktraten, stellten wir fest, dass wir etwas früher verpasst hatten. Denken Sie daran, dass Sie zur "Korrektur" des Spiels einen von zwei Einträgen zur Registrierung hinzufügen müssen - DisablePSGPund DisableD3DXPSGP. Wenn wir davon ausgehen, dass ihre Namen über ihren Zweck sprechen, DisableD3DXPSGPsollte es sich um eine Teilmenge handeln DisablePSGP, wobei erstere PSGP nur in D3DX und letztere sowohl in D3DX als auch in D3D deaktivieren. Nachdem wir diese Annahme getroffen haben, wenden wir uns D3DX zu.



Mass Effect importiert die D3DX-Funktionen wie folgt d3dx9_31.dll:



D3DXUVAtlasCreate
D3DXMatrixInverse
D3DXWeldVertices
D3DXSimplifyMesh
D3DXDebugMute
D3DXCleanMesh
D3DXDisassembleShader
D3DXCompileShader
D3DXAssembleShader
D3DXLoadSurfaceFromMemory
D3DXPreprocessShader
D3DXCreateMesh


Wenn ich diese Liste sehen würde, ohne die Informationen zu kennen, die wir aus den Aufnahmen erhalten haben, würde ich annehmen, dass der wahrscheinliche Schuldige D3DXPreprocessShaderentweder sein könnte D3DXCompileShader- Shader könnten falsch optimiert und / oder auf AMD kompiliert werden, aber es kann wahnsinnig schwierig sein, sie zu reparieren.



Da wir jedoch bereits über Kenntnisse verfügen, wird für uns eine Funktion aus der Liste hervorgehoben - dies D3DXMatrixInverseist die einzige Funktion, mit der die Pixel-Shader-Konstanten vorbereitet werden können.



Diese Funktion wird nur von einer Stelle im Spiel aufgerufen:



int __thiscall InvertMatrix(void *this, int a2)
{
  D3DXMatrixInverse(a2, 0, this);
  return a2;
}


Es ist jedoch nicht sehr gut implementiert. Eine kurze Studie d3dx9_31.dllzeigt, dass D3DXMatrixInversedie Ausgabeparameter nicht berührt werden. Wenn die Inversion der Matrix nicht möglich ist (weil die Eingabematrix entartet ist), kehrt sie zurück nullptr, aber das Spiel kümmert sich überhaupt nicht darum. Die Ausgabematrix bleibt möglicherweise nicht initialisiert, ah-yay! Tatsächlich tritt die Inversion entarteter Matrizen im Spiel auf (meistens im Hauptmenü), aber was auch immer wir getan haben, um das Spiel besser zu handhaben (z. B. die Ausgabe auf Null zu setzen oder ihr eine Identitätsmatrix zuzuweisen), hat sich grafisch nichts geändert. So läuft das.



Nachdem wir diese Theorie widerlegt hatten, kehrten wir zu PSGP zurück - was genau macht PSGP in D3DX? Rafael Rivera untersuchte diese Frage und die Logik hinter dieser Pipeline erwies sich als ziemlich einfach:



AddFunctions(x86)
if(DisablePSGP || DisableD3DXPSGP) {
  // All optimizations turned off
} else {
  if(IsProcessorFeaturePresent(PF_3DNOW_INSTRUCTIONS_AVAILABLE)) {
    if((GetFeatureFlags() & MMX) && (GetFeatureFlags() & 3DNow!)) {
      AddFunctions(amd_mmx_3dnow)
      if(GetFeatureFlags() & Amd3DNowExtensions) {
        AddFunctions(amd3dnow_amdmmx)
      }
    }
    if(GetFeatureFlags() & SSE) {
      AddFunctions(amdsse)
    }
  } else if(IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE /* SSE2 */)) {
    AddFunctions(intelsse2)
  } else if(IsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE /* SSE */)) {
    AddFunctions(intelsse)
  }
}


Wenn PSGP nicht deaktiviert ist, wählt D3DX Funktionen aus, die für einen bestimmten Befehlssatz optimiert sind. Dies ist logisch und bringt uns zurück zur ursprünglichen Theorie. Wie sich herausstellte, verfügt D3DX über Funktionen, die für AMD und den 3DNow! -Anweisungssatz optimiert sind, sodass das Spiel sie letztendlich indirekt verwendet. Moderne AMD-Prozessoren, denen 3DNow fehlt! Anweisungen folgen dem gleichen Weg wie Intel-Prozessoren - das heißt von intelsse2.



Zusammenfassen:



  • Wenn PSGP deaktiviert ist, folgen sowohl Intel als auch AMD dem normalen Codeausführungspfad x86.
  • Intel-Prozessoren durchlaufen immer den Codepfad intelsse22 .
  • AMD-Prozessoren mit 3DNow! Gehen Sie durch den Code-Ausführungspfad amd_mmx_3dnowoder amd3dnow_amdmmx, und Prozessoren ohne 3DNow durchlaufen intelsse2.


Nachdem wir diese Informationen erhalten haben, werden wir eine Hypothese aufstellen - wahrscheinlich stimmt etwas mit den AMD SSE2-Befehlen nicht, und die auf AMD berechneten Matrixinversionsergebnisse intelsse2sind entweder zu ungenau oder völlig falsch .



Wie können wir diese Hypothese testen? Tests natürlich!



PS: Sie denken vielleicht, "wird im Spiel verwendet d3dx9_31.dll, aber die neueste D3DX9-Bibliothek hat eine Version d3dx9_43.dll, und dieser Fehler wurde höchstwahrscheinlich in neueren Versionen behoben?" Wir haben versucht, das Spiel zu "aktualisieren", um die neueste DLL zu verknüpfen, aber nichts hat sich geändert.



Teil 3 - Unabhängige Tests



Wir haben ein einfaches, unabhängiges Programm vorbereitet, um die Genauigkeit der Matrixinversion zu testen. Während einer kurzen Spielsitzung haben wir am Ort des Fehlers alle eingehenden und ausgehenden Daten D3DXMatrixInversein einer Datei aufgezeichnet . Diese Datei wird von einem unabhängigen Testprogramm gelesen und die Ergebnisse werden neu berechnet. Die Ausgabe des Spiels wird mit den vom Testprogramm berechneten Daten verglichen, um die Richtigkeit zu überprüfen.



Nach mehreren Versuchen, die auf Daten basieren, die von Intel- und AMD-Chips mit aktiviertem / deaktiviertem PSGP gesammelt wurden, haben wir die Ergebnisse verschiedener Computer verglichen. Die Ergebnisse sind unten gezeigt und zeigen Erfolg ( , Ergebnisse sind gleich) und Misserfolge (, Ergebnisse sind nicht gleich) Läufe. Die letzte Spalte zeigt an, ob das Spiel Daten korrekt verarbeitet oder "fehlerhaft" ist. Wir ignorieren bewusst die Ungenauigkeit von Gleitkommaberechnungen und vergleichen die Ergebnisse mit memcmp:



Datenquelle Intel SSE2 AMD SSE2 Intel x86 AMD x86 Werden die Daten vom Spiel akzeptiert?
Intel SSE2
AMD SSE2
Intel x86
AMD x86


D3DXMatrixInverse Testergebnisse Seltsamerweise



zeigen die Ergebnisse, dass:



  • Das Rechnen mit SSE2 kann nicht zwischen Intel- und AMD-Computern übertragen werden.
  • Computing ohne SSE2 wird zwischen Maschinen portiert .
  • Berechnungen ohne SSE2 werden vom Spiel "akzeptiert", obwohl sie sich von Berechnungen mit Intel SSE2 unterscheiden.


Daher stellt sich die Frage: Was genau ist falsch an den Berechnungen mit AMD SSE2, weil sie zu Störungen im Spiel führen? Wir haben keine genaue Antwort darauf, aber es sieht so aus, als ob es das Ergebnis zweier Faktoren ist:



  • D3DXMatrixInverse SSE2 — , SSE2 Intel/AMD (, - ), , .
  • , .


In diesem Stadium sind wir bereit, einen Fix zu erstellen, der D3DXMatrixInversedie neu geschriebene x86-Variante der D3DX-Funktion ersetzt, und das war's. Ich hatte jedoch einen anderen zufälligen Gedanken - D3DX ist veraltet und wurde durch DirectXMath ersetzt . Ich entschied, dass wir diese Matrixfunktion, wenn wir sie trotzdem ersetzen möchten, ändern können XMMatrixInverse, was ein "moderner" Ersatz für die Funktion ist D3DXMatrixInverse. Es werden XMMatrixInverseauch SSE2-Befehle verwendet, das heißt, es ist genauso optimal wie mit der Funktion von D3DX, aber ich war mir fast sicher, dass die Fehler darin dieselben sein würden.



Ich schrieb den Code schnell, schickte ihn an Raphael und ...



Es hat super funktioniert! (?)



Letztendlich kann das, was wir aufgrund kleiner Unterschiede in den SSE2-Teams als Problem empfanden, ein äußerst numerisches Problem sein. Obwohl es XMMatrixInverseauch SSE2 verwendet, lieferte es sowohl bei Intel als auch bei AMD perfekte Ergebnisse. Daher haben wir dieselben Tests erneut durchgeführt und die Ergebnisse waren, gelinde gesagt, unerwartet:



Datenquelle Intel AMD Werden die Daten vom Spiel akzeptiert?
Intel
AMD


Benchmark-Ergebnisse mit XMMatrixInverse



Das Spiel funktioniert nicht nur gut, sondern die Ergebnisse stimmen auch perfekt überein und werden zwischen den Maschinen übertragen!



In diesem Sinne haben wir unsere Theorie über die Ursachen des Fehlers überarbeitet - ohne Zweifel ist das Spiel schuld, das zu empfindlich für Probleme ist; Nach der Durchführung zusätzlicher Tests schien es uns jedoch, dass D3DX für schnelle Berechnungen geschrieben wurde, und DirectXMath befasst sich mehr mit der Genauigkeit von Berechnungen. Es scheint logisch, denn D3DX ist ein Produkt der 2000er Jahre und es ist durchaus vernünftig, dass Geschwindigkeit seine Hauptpriorität war. DirectXMath wurde später entwickelt, damit die Autoren präzisen, deterministischen Berechnungen mehr Aufmerksamkeit schenken konnten.



Teil 4 - Alles zusammenfügen



Der Artikel war ziemlich lang, ich hoffe du bist nicht müde. Fassen wir zusammen, was wir getan haben:



  • , 3DNow! ( DLL).
  • , PSGP AMD.
  • PIX — NaN .
  • D3DXMatrixInverse.
  • , Intel AMD, SSE2.
  • , XMMatrixInverse .


Wir müssen nur noch den richtigen Ersatz implementieren! Hier kommt SilentPatch for Mass Effect ins Spiel . Wir haben beschlossen, dass die sauberste Lösung für dieses Problem darin besteht, einen Spoofer zu erstellen d3dx9_31.dll, der alle exportierten Mass Effect-Funktionen mit Ausnahme der Funktion in die System-DLL umleitet D3DXMatrixInverse. Für diese Funktion haben wir eine entwickelt XMMatrixInverse.



Die Ersatz-DLL bietet eine sehr saubere und zuverlässige Installation und funktioniert hervorragend mit den Origin- und Steam-Versionen des Spiels. Es kann sofort verwendet werden, ohne dass ASI Loader oder andere Software von Drittanbietern erforderlich ist.



Soweit wir verstehen, sieht das Spiel jetzt so aus, wie es sollte, ohne die geringste Verschlechterung der Beleuchtung:



Bild


Bild


Noveria



Bild


Bild


Ilos



Downloads



Die Änderung kann von Mods & Patches heruntergeladen werden . Klicken Sie hier, um direkt zur Spieleseite zu gelangen:



SilentPatch für Mass Effect



herunterladen Nach dem Herunterladen extrahieren Sie einfach das Archiv in den Spielordner und fertig ! Wenn Sie sich nicht sicher sind, was Sie als Nächstes tun sollen, lesen Sie die Installationsanweisungen .






Der komplette Quellcode des Mods wird auf GitHub veröffentlicht und kann frei als Ausgangspunkt verwendet werden:



Quellcode auf GitHub



Anmerkungen



  1. Theoretisch könnte es auch ein Fehler in d3d9.dll sein, der die Dinge ein wenig komplizieren würde. Zum Glück war dies nicht der Fall.
  2. Angenommen, sie haben den SSE2-Befehlssatz, aber jeder Intel-Prozessor ohne diese Befehle ist viel schwächer als die Mindestsystemanforderungen für Mass Effect.


Siehe auch:






All Articles