إصلاح خطأ رسومات Mass Effect على معالجات AMD الحديثة

صورة


المقدمة



Mass Effect هو امتياز الخيال العلمي RPG الشهير. تم إصدار الجزء الأول لأول مرة بواسطة BioWare في أواخر عام 2007 حصريًا لأجهزة Xbox 360 بموجب اتفاقية مع Microsoft. بعد بضعة أشهر ، في منتصف عام 2008 ، تلقت اللعبة منفذ كمبيوتر تم تطويره بواسطة Demiurge Studios. كان المنفذ لائقًا ولم يكن به عيوب ملحوظة حتى أصدرت AMD معالجاتها المعمارية الجديدة Bulldozer في عام 2011. عند بدء تشغيل لعبة على جهاز كمبيوتر باستخدام معالجات AMD حديثة في موقعين للعبة (Noveria و Ilos) ، تظهر رسومات فنية خطيرة:





نعم ، يبدو قبيحًا.



في حين أن هذا لا يجعل اللعبة غير قابلة للعب ، فإن هذه القطع الأثرية مزعجة. لحسن الحظ ، هناك حل ، مثل إيقاف تشغيل الإضاءة بأوامر وحدة التحكم أو تعديل خرائط اللعبة لإزالة الأضواء المكسورة ، ولكن يبدو أنه لم يفهم أحد سبب هذه المشكلة تمامًا. تدعي بعض المصادر أن تعديل FPS Counter يعمل أيضًا على إصلاح هذه المشكلة ، لكن لم أتمكن من العثور على معلومات عنها: لا يبدو أن الكود المصدري للمود قد تم نشره عبر الإنترنت ، ولا توجد وثائق حول كيفية إصلاح التعديل للخطأ.



لماذا هذه المشكلة مثيرة جدا للاهتمام؟ تعد الأخطاء التي تحدث فقط على الأجهزة من جهات تصنيع معينة شائعة جدًا ، وقد تمت مواجهتها في الألعاب لعدة عقود. ومع ذلك ، وفقًا لمعلوماتي ، هذه هي الحالة الوحيدة التي تحدث فيها مشكلة الرسومات بسبب المعالج وليس بطاقة الرسومات. في معظم الحالات ، تنشأ المشاكل مع منتجات مُصنِّع GPU معين ولا تؤثر على وحدة المعالجة المركزية بأي شكل من الأشكال ، ولكن في هذه الحالة يكون العكس هو الصحيح. لذلك ، هذا الخطأ فريد من نوعه وبالتالي يستحق التحقيق فيه.



بعد قراءة المناقشات عبر الإنترنت ، توصلت إلى استنتاج مفاده أن المشكلة تبدو مع رقائق AMD FX و Ryzen. على عكس معالجات AMD القديمة ، تفتقر هذه الرقائق إلى مجموعة التعليمات 3DNow! ... ربما لا علاقة للخطأ بهذا ، ولكن بشكل عام ، هناك إجماع في مجتمع اللاعبين على أن هذا هو سبب الخطأ وأنه عندما تجد معالج AMD ، تحاول اللعبة استخدام هذه الأوامر. معتبرا أنه لا توجد حالات معروفة لهذا الخطأ على معالجات إنتل ، وأن 3DNow! استخدم AMD فقط ، فلا عجب أن ألقى المجتمع باللوم على مجموعة التعليمات هذه على أنها السبب.



لكن هل هي المشكلة ، أم أن هناك شيئًا مختلفًا تمامًا هو الذي يسبب الخطأ؟ هيا نكتشف!



الجزء الأول - البحث



مقدمة



على الرغم من أنه من السهل للغاية إعادة إنشاء هذه المشكلة ، إلا أنني لم أتمكن من تقييمها لفترة طويلة لسبب بسيط - لم يكن لدي جهاز كمبيوتر به معالج AMD في متناول اليد! لحسن الحظ ، هذه المرة لا أقوم بإجراء بحثي بمفردي - لقد دعمني رافائيل ريفيرا في عملية التعلم من خلال توفير بيئة اختبار مع شريحة AMD ، كما شارك افتراضاته وأفكاره أثناء تخميني بشكل أعمى ، كما هو الحال عادةً عندما أبحث مصادر مثل هذه المشاكل غير المعروفة.



نظرًا لأن لدينا الآن بيئة اختبار ، فقد اختبرنا النظرية الأولى بالطبعcpuid- إذا كان الناس على حق في افتراض أن فريق 3DNow! يجب إلقاء اللوم على الفرق ، فيجب أن يكون هناك مكان في رمز اللعبة للتحقق من وجودهم ، أو على الأقل يحدد الشركة المصنعة لوحدة المعالجة المركزية. ومع ذلك ، هناك خطأ في مثل هذا التفكير ؛ إذا حاولت اللعبة حقًا استخدام 3DNow! على أي شريحة AMD دون التحقق من إمكانية دعمها ، فمن المرجح أن يتعطل عند محاولة تنفيذ أمر غير صالح. علاوة على ذلك ، يُظهر فحص موجز لرمز اللعبة أنها لا تختبر قدرات وحدة المعالجة المركزية. لذلك ، مهما كان سبب الخطأ ، لا يبدو أنه ناتج عن خطأ في تحديد وظائف المعالج ، لأن اللعبة غير مهتمة بها على الإطلاق.



عندما بدأت القضية تبدو مستحيلة التصحيح ، أبلغني رافائيل باكتشافه - تعطيل PSGPيعمل (مسار الرسومات الخاص بالمعالج) على إصلاح المشكلة ويتم إضاءة جميع الأحرف بشكل صحيح! PSGP ليس المفهوم الأكثر توثيقًا على نطاق واسع ؛ باختصار ، هذه وظيفة قديمة (فقط للإصدارات الأقدم من DirectX) تسمح لـ Direct3D بإجراء تحسينات على معالجات معينة:



في الإصدارات السابقة من DirectX ، كان هناك مسار تنفيذ رمز يسمى PSGP يسمح بمعالجة قمة الرأس. كان على التطبيقات أن تأخذ هذا المسار في الحسبان وتحافظ على مسار لمعالجة قمة الرأس بواسطة المعالج ونوى الرسومات.


مع هذا النهج ، من المنطقي أن يؤدي تعطيل PSGP إلى إزالة العيوب الموجودة على AMD - كان المسار الذي اختاره معالجات AMD الحديثة معيبًا إلى حد ما. كيف يمكنني تعطيله؟ تتبادر إلى الذهن طريقتان:



  • يمكنك تمرير IDirect3D9::CreateDeviceالعلم إلى الوظيفة D3DCREATE_DISABLE_PSGP_THREADING. توصف على النحو التالي:



    . , (worker thread), .


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


يبدو أنه DisableD3DXPSGPقادر على حل هذه المشكلة. لذلك ، إذا كنت لا تحب تنزيل إصلاحات / تعديلات تابعة لجهات خارجية أو ترغب في حل المشكلة دون إجراء أي تغييرات على اللعبة ، فهذه طريقة فعالة تمامًا. إذا قمت بتعيين هذه العلامة لـ Mass Effect فقط ، وليس للنظام بأكمله ، فسيكون كل شيء على ما يرام!



بيكس



كالعادة ، إذا واجهت مشاكل في الرسومات ، فمن المرجح أن يساعد ذلك في تشخيص PIX. التقطنا مشاهد مماثلة على أجهزة Intel و AMD ثم قارننا النتائج. لفت انتباهي اختلاف واحد على الفور - على عكس مشاريعي السابقة ، حيث لم تسجل اللقطات خطأ ويمكن أن يبدو الالتقاط نفسه مختلفًا على أجهزة كمبيوتر مختلفة (مما يشير إلى خطأ في برنامج التشغيل أو d3d9.dll) ، هذه اللقطات كتب أسفل خطأ! بمعنى آخر ، إذا فتحت لقطة تم إجراؤها على أجهزة AMD على جهاز كمبيوتر باستخدام معالج Intel ، فسيتم عرض الخطأ .



يبدو الالتقاط من AMD إلى Intel هو نفسه تمامًا كما بدا على الأجهزة التي تم التقاطها:





ما يخبرنا هذا الكلام؟



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


وبعبارة أخرى ، من شبه المؤكد أن هذا ليس خطأ السائق. يبدو أن البيانات الواردة المعدة من خلال GPU تالفة بطريقة ما 1 . هذه حالة نادرة جدًا بالفعل!



في هذه المرحلة ، من أجل العثور على الخطأ ، من الضروري إيجاد كل التناقضات بين اللقطات. إنه عمل ممل ، لكن لا توجد طريقة أخرى.



بعد دراسة طويلة للبيانات التي تم التقاطها ، تم لفت انتباهي إلى الدعوة لرسم جسم الشخصية بالكامل:





في عملية الاستحواذ التي قامت بها شركة Intel ، تُخرج هذه المكالمة معظم جسد الشخصية جنبًا إلى جنب مع الإضاءة والقوام. في انتزاع AMD ، فإنه ينتج نموذج أسود صلب. يبدو أننا حصلنا على الطريق الصحيح.



سيكون أول مرشح واضح للفحص هو الأنسجة المقابلة ، لكن يبدو أنها جيدة وهي متشابهة في كلتا اللقطتين. ومع ذلك ، تبدو بعض ثوابت تظليل البكسل غريبة. لا تحتوي فقط على NaN (ليس رقمًا) ، ولكنها موجودة أيضًا في التقاط AMD فقط:





1. # QO تعني NaN



تبدو واعدة - غالبًا ما تتسبب قيم NaN في أعمال رسومية غريبة. من المضحك أن إصدار PlayStation 3 من Mass Effect 2 واجه مشكلة مشابهة جدًا في محاكي RPCS3 ، المرتبط أيضًا بـ NaN!



ومع ذلك ، لا تكن سعيدًا جدًا في الوقت الحالي - فقد تكون هذه قيمًا خلفتها المكالمات السابقة ولم يتم استخدامها في المكالمة الحالية. لحسن الحظ ، في حالتنا ، من الواضح أنه يتم تمرير NaNs هذه إلى D3D لهذا العرض بالذات ...



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


... ويشير تظليل البكسل المستخدم في هذا العرض إلى كلا الثوابت:



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


يبدو أن كلا الثوابت مأخوذ مباشرة من Unreal Engine وكما يوحي اسمهما ، يمكن أن تؤثر على الإضاءة. بنغو!



يؤكد الاختبار داخل اللعبة نظريتنا - على جهاز Intel ، لا يتم تمرير متجه من أربعة قيم NaN على أنه ثوابت تظليل بكسل ؛ ومع ذلك ، على جهاز AMD ، تبدأ قيم NaN في الظهور بمجرد دخول اللاعب إلى المكان الذي تنقطع فيه الإضاءة!



هل هذا يعني أن المهمة انتهت؟ بعيدًا عن ذلك ، لأن إيجاد ثوابت محطمة هو نصف المعركة فقط. يبقى السؤال - من أين أتوا وهل يمكن استبدالهم؟ في الاختبار داخل اللعبة ، أدى تغيير قيم NaN إلى إصلاح المشكلة جزئيًا - اختفت البقع السوداء القبيحة ، لكن الشخصيات ما زالت تبدو مظلمة جدًا:





صحيح تقريبًا ... لكن ليس تمامًا.



نظرًا لمدى أهمية قيم الإضاءة هذه للمشهد ، لا يمكننا التوقف عند هذا الحل. ومع ذلك ، نحن نعلم أننا نسير على الطريق الصحيح!



للأسف ، أشارت أي محاولات لتعقب مصادر هذه الثوابت إلى شيء يشبه تدفق العرض ، وليس الوجهة الفعلية. في حين أن تصحيح هذا أمر ممكن ، فمن الواضح أننا بحاجة إلى تجربة نهج جديد قبل إنفاق قدر لا حصر له من الوقت في تتبع تدفقات البيانات بين داخل اللعبة و / أو الهياكل المرتبطة بـ UE3.



الجزء الثاني - إلقاء نظرة فاحصة على D3DX



بالعودة إلى الوراء ، أدركنا أننا قد فاتنا شيئًا سابقًا. تذكر أنه لإصلاح اللعبة ، فأنت بحاجة إلى إضافة أحد إدخالين إلى السجل - DisablePSGPو DisableD3DXPSGP. إذا افترضنا أن أسمائهم تشير إلى الغرض منها ، فيجب DisableD3DXPSGPأن تكون مجموعة فرعية DisablePSGP، مع تعطيل الأول PSGP فقط في D3DX ، والأخير في كل من D3DX و D3D. بعد إجراء هذا الافتراض ، دعنا نوجه أعيننا إلى D3DX.



يستورد Mass Effect مجموعة ميزات D3DX من خلال تأليف d3dx9_31.dll:



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


إذا رأيت هذه القائمة ، دون علمي بالمعلومات التي حصلنا عليها من اللقطات ، فسأفترض أن الجاني المحتمل يمكن أن يكون D3DXPreprocessShaderإما D3DXCompileShader- يمكن تحسين التظليل و / أو تجميعه بشكل غير صحيح على AMD ، ولكن إصلاحها قد يكون صعبًا للغاية.



ومع ذلك ، لدينا بالفعل معرفة ، لذلك بالنسبة لنا يتم تمييز وظيفة واحدة من القائمة - إنها D3DXMatrixInverseالوظيفة الوحيدة التي يمكن استخدامها لإعداد ثوابت تظليل البكسل.



يتم استدعاء هذه الوظيفة من مكان واحد فقط في اللعبة:



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


ومع ذلك ... لم يتم تنفيذه جيدًا. d3dx9_31.dllتظهر دراسة قصيرة أنها D3DXMatrixInverseلا تلمس معلمات الإخراج ، وإذا كان انعكاس المصفوفة مستحيلاً (لأن مصفوفة الإدخال تتدهور) ، فإنها تعود nullptr، لكن اللعبة لا تهتم على الإطلاق. قد تظل مصفوفة الإخراج غير مهيأة ، آه ياي! في الواقع ، يحدث انعكاس المصفوفات المتدهورة في اللعبة (غالبًا في القائمة الرئيسية) ، ولكن كل ما فعلناه لجعل اللعبة تتعامل معها بشكل أفضل (على سبيل المثال ، خفض الناتج أو تعيين مصفوفة هوية لها) ، لم يتغير شيء بيانياً. هكذا تمشي الامور.



بعد دحض هذه النظرية ، عدنا إلى PSGP - ماذا يفعل PSGP بالضبط في D3DX؟ نظر رافائيل ريفيرا في هذا السؤال واتضح أن المنطق وراء خط الأنابيب هذا بسيط جدًا:



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)
  }
}


إذا لم يتم تعطيل PSGP ، فإن D3DX يختار الميزات التي تم تحسينها لمجموعة تعليمات معينة. هذا منطقي ويعيدنا إلى النظرية الأصلية. كما اتضح فيما بعد ، D3DX لديها ميزات محسّنة لـ AMD ومجموعة تعليمات 3DNow! ، لذلك تستخدمها اللعبة في النهاية بشكل غير مباشر. معالجات AMD الحديثة التي تفتقر إلى 3DNow! تتبع التعليمات نفس المسار الذي تتبعه معالجات Intel - أي من خلال intelsse2.



لخص:



  • عند تعطيل PSGP ، يتبع كل من Intel و AMD المسار العادي لتنفيذ التعليمات البرمجية x86.
  • تمر معالجات Intel دائمًا عبر مسار الكود intelsse22 .
  • معالجات AMD بتقنية 3DNow! انتقل من خلال مسار تنفيذ التعليمات البرمجية amd_mmx_3dnowأو amd3dnow_amdmmx، والمعالجات بدون 3DNow تمر intelsse2.


بعد تلقي هذه المعلومات ، سنطرح فرضية - ربما يكون هناك خطأ ما في أوامر AMD SSE2 ، ونتائج انعكاس المصفوفة المحسوبة على AMD على طول الطريق intelsse2إما غير دقيقة للغاية أو غير صحيحة تمامًا .



كيف يمكننا اختبار هذه الفرضية؟ الاختبارات بالطبع!



ملاحظة: ربما تفكر في أنه "مستخدمة في اللعبة d3dx9_31.dll، لكن أحدث مكتبة D3DX9 بها إصدار d3dx9_43.dll، وعلى الأرجح ، تم إصلاح هذا الخطأ في الإصدارات الأحدث؟" حاولنا "ترقية" اللعبة لربط أحدث DLL ، لكن لم يتغير شيء.



الجزء 3 - الاختبارات المستقلة



لقد أعددنا برنامجًا بسيطًا ومستقلًا لاختبار دقة انعكاس المصفوفة. أثناء جلسة لعبة قصيرة ، في موقع الخطأ ، سجلنا جميع بيانات الإدخال والإخراج D3DXMatrixInverseفي ملف. تتم قراءة هذا الملف بواسطة برنامج اختبار مستقل ويتم إعادة حساب النتائج. تتم مقارنة إخراج اللعبة بالبيانات التي يحسبها برنامج الاختبار للتحقق من صحتها.



بعد عدة محاولات بناءً على البيانات التي تم جمعها من رقائق Intel و AMD مع تمكين / تعطيل PSGP ، قمنا بمقارنة نتائج الأجهزة المختلفة. النتائج موضحة أدناه ، تشير إلى النجاح ( ، النتائج متساوية) والفشل (، النتائج ليست متساوية) أشواط. يشير العمود الأخير إلى ما إذا كانت اللعبة تعالج البيانات بشكل صحيح أم أنها "عربات التي تجرها الدواب". نتجاهل عمدًا عدم دقة حسابات الفاصلة العائمة ونقارن النتائج باستخدام memcmp:



مصدر البيانات إنتل SSE2 AMD SSE2 انتل x86 معالج AMD x86 هل البيانات مقبولة باللعبة؟
إنتل SSE2
AMD SSE2
انتل x86
معالج AMD x86


نتائج اختبار D3DXMatrixInverse من



الغريب أن النتائج تظهر ما يلي:



  • الحوسبة باستخدام SSE2 ليست محمولة بين أجهزة Intel و AMD.
  • يتم نقل الحوسبة بدون SSE2 بين الأجهزة.
  • يتم "قبول" الحسابات بدون SSE2 في اللعبة ، على الرغم من حقيقة أنها تختلف عن الحسابات في Intel SSE2.


لذلك ، فإن السؤال الذي يطرح نفسه: ما هو الخطأ بالضبط في حسابات AMD SSE2 ، بسبب ما تؤدي إلى حدوث خلل في اللعبة؟ ليس لدينا إجابة دقيقة لها ، ولكن يبدو أنها نتيجة عاملين:



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


في هذه المرحلة ، نحن جاهزون لإنشاء إصلاح سيحل محل D3DXMatrixInverseمتغير x86 المعاد كتابته لوظيفة D3DX ، وهذا كل شيء. ومع ذلك ، كان لدي فكرة عشوائية أخرى - تم إهمال D3DX واستبداله بـ DirectXMath . قررت أنه إذا كنا نريد حقًا استبدال وظيفة المصفوفة هذه على أي حال ، فيمكننا تغييرها إلى XMMatrixInverse، وهو بديل "حديث" للوظيفة D3DXMatrixInverse. كما XMMatrixInverseأنه يستخدم أوامر SSE2 ، أي أنه سيكون مثالياً كما هو الحال مع الوظيفة من D3DX ، لكنني كنت متأكدًا تقريبًا من أن الأخطاء فيه ستكون هي نفسها.



كتبت الرمز بسرعة ، وأرسلته إلى رافائيل ، و ...



لقد نجح بشكل رائع! (؟)



في النهاية ، ما اعتبرناه مشكلة بسبب الاختلافات الصغيرة في فرق SSE2 قد يكون مشكلة عددية للغاية. على الرغم من أنه XMMatrixInverseيستخدم أيضًا SSE2 ، إلا أنه أعطى نتائج مثالية على كل من Intel و AMD. لذلك أجرينا نفس الاختبارات مرة أخرى وكانت النتائج غير متوقعة ، على أقل تقدير:



مصدر البيانات شركة انتل AMD هل البيانات مقبولة باللعبة؟
شركة انتل
AMD


نتائج Benchmark مع XMMatrixInverse



لا تعمل اللعبة بشكل جيد فحسب ، بل تتطابق النتائج تمامًا وتنتقل بين الأجهزة!



مع وضع هذا في الاعتبار ، قمنا بمراجعة نظريتنا حول أسباب الخطأ - دون أدنى شك ، يقع اللوم على اللعبة ، وهي حساسة للغاية للمشاكل ؛ ومع ذلك ، بعد إجراء اختبارات إضافية ، بدا لنا أن D3DX تمت كتابته لإجراء عمليات حسابية سريعة ، وأن DirectXMath يهتم بدرجة أكبر بدقة الحسابات. يبدو هذا منطقيًا ، نظرًا لأن D3DX هو منتج من العقد الأول من القرن الحادي والعشرين ، ومن المنطقي أن تكون السرعة على رأس أولوياته. تم تطوير DirectXMath لاحقًا ، بحيث يمكن للمؤلفين إيلاء المزيد من الاهتمام للحسابات الدقيقة والحتمية.



الجزء 4 - وضع كل ذلك معًا



تبين أن المقالة طويلة جدًا ، أتمنى ألا تكون متعبًا. دعونا نلخص ما قمنا به:



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


الشيء الوحيد المتبقي لنا للتنفيذ هو الاستبدال الصحيح! هنا يأتي دور SilentPatch for Mass Effect . قررنا أن أنظف حل لهذه المشكلة هو إنشاء مخادع من d3dx9_31.dllشأنه إعادة توجيه جميع وظائف Mass Effect التي تم تصديرها إلى DLL للنظام ، باستثناء الوظيفة D3DXMatrixInverse. لهذه الميزة ، قمنا بتطوير ملف XMMatrixInverse.



يوفر DLL البديل تثبيتًا نظيفًا وموثوقًا للغاية ويعمل بشكل رائع مع إصدارات Origin و Steam من اللعبة. يمكن استخدامه على الفور ، دون الحاجة إلى ASI Loader أو أي برنامج تابع لجهة خارجية.



بقدر ما نفهم ، تبدو اللعبة الآن كما ينبغي ، دون أدنى تدهور في الإضاءة:



صورة


صورة


نوفيريا



صورة


صورة


ط لوس



التحميلات



يمكن تنزيل التعديل من Mods & Patches . انقر هنا للانتقال مباشرة إلى صفحة اللعبة:



تنزيل SilentPatch لـ Mass Effect



بعد التنزيل ، فقط قم باستخراج الأرشيف في مجلد اللعبة ، وهذا كل شيء! إذا لم تكن متأكدًا مما يجب فعله بعد ذلك ، فاقرأ تعليمات الإعداد .






يتم نشر الكود المصدري الكامل للنموذج على GitHub ويمكن استخدامه بحرية كنقطة بداية:



المصدر على GitHub



ملاحظات



  1. من الناحية النظرية ، يمكن أيضًا أن يكون خطأ داخل d3d9.dll ، مما قد يعقد الأمور قليلاً. لحسن الحظ ، لم يكن هذا هو الحال.
  2. على افتراض أن لديهم مجموعة تعليمات SSE2 ، بالطبع ، لكن أي معالج Intel بدون هذه التعليمات يكون أضعف بكثير من الحد الأدنى لمتطلبات النظام لـ Mass Effect.


أنظر أيضا:






All Articles