مشروع WideNES - تجاوز حدود شاشة NES

الصورة

في منتصف الثمانينيات ، كان نظام Nintendo Entertainment (NES) وحدة تحكم لا بد منها. أفضل صوت وأفضل رسومات وأفضل ألعاب بين جميع وحدات التحكم في ذلك الوقت - وسعت وحدة التحكم حدود الممكن. حتى الآن ، مشاريع مثل سوبر ماريو بروس. ، تعتبر The Legend of Zelda و Metroid بعضًا من أفضل الألعاب على الإطلاق.

بعد أكثر من 30 عامًا على إصدار NES ، تبدو الألعاب الكلاسيكية رائعة ، ولا يمكن قولها عن الأجهزة التي عملت عليها. مع دقة 256 × 240 فقط ، لا يمكن لوحدة تحكم NES توفير الألعاب بمساحة كافية. ومع ذلك ، تمكن المطورون الشجعان من التوفيق بين ألعاب NES المذهلة والعوالم التي لا تنسى: الزنزانات الشبيهة بالمتاهة من The Legend of Zelda ، ومساحات شاسعة من الكوكب في Metroid ، ومستويات مشرقة من Super Mario Bros. . ومع ذلك ، نظرًا لقيود أجهزة NES ، لا يمكن للاعبين تجاوز 256 × 240 ...

حتى وقت قريب.

أقدم لكم مشروع WideNES - طريقة جديدة للعب كلاسيكيات NES!



WideNES هي تقنية جديدة للترميز بشكل تلقائي وتفاعلي لألعاب NES في الوقت الفعلي .

عندما يتحرك اللاعبون حول المستوى ، يسجل WideNES الشاشة ، ويبني تدريجياً خريطة للجزء المستكشف من العالم. في المستويات اللاحقة ، يقوم WideNES بمزامنة طريقة اللعب على الشاشة مع الخريطة التي تم إنشاؤها ، مما يسمح بشكل أساسي للاعبين بمشاهدة المزيد من خلال "النظر" خارج حدود شاشة NES! والأفضل من ذلك كله ، أن الطريقة التي ترمي بها ألعاب WideNES عالمية تمامًا ، مما يسمح لمجموعة كبيرة من ألعاب NES بالعمل مع WideNES بدون أي تكوين!

ولكن كيف يعمل كل ذلك؟



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



كيف يعمل wideNES


قبل الخوض في التفاصيل ، من المهم شرح كيفية عرض NES للرسومات بإيجاز.

نقل البكسل باستخدام PPU


قلب NES هو معالج MOS 6502. الموقر.في أواخر السبعينيات وأوائل الثمانينيات ، تم استخدام 6502 في كل مكان وعملوا في آلات أسطورية مثل Commodore 64 و Apple II وغيرها الكثير. لقد كانت رخيصة وسهلة البرمجة وقوية بما يكفي لتكون خطرة.

كان استكمال 6502 في وحدة تحكم NES عبارة عن معالج رسومات قوي يسمى وحدة معالجة الصور (PPU). مقارنة بمعالجات الفيديو البسيطة المستخدمة في الأنظمة القديمة ، تعد PPU تحسنًا كبيرًا من حيث سهولة الاستخدام. على سبيل المثال ، قبل خمس سنوات من إصدار NES ، تم استخدام معالج Atari 2600 6502 لإرسال تعليمات رسومية إلى المعالج المشترك لكل خط نقطي ، مما ترك المعالج القليل من الوقت لتنفيذ منطق اللعبة. للمقارنة: احتاج PPU إلى أمرين فقط لكل إطار ، وهذا أعطى 6502 وقتًا كافيًا لإنشاء لعبة مثيرة للاهتمام ومبتكرة.

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

  • الدقة: 256x240 بكسل ، 60 هرتز
  • يعمل بشكل مستقل عن وحدة المعالجة المركزية
    • يتواصل مع وحدة المعالجة المركزية باستخدام I / O مع تعيين ذاكرة (نطاق العنوان 0x2000 - 0x2007)
  • 2 طبقات تجسيد: طبقة العفريت وطبقة الخلفية
    • طبقة العفريت
      • يمكن وضع كل رمح فردي في أي مكان على الشاشة.
      • كبيرة لتحريك الأشياء: لاعب ، أعداء ، قذائف
      • ما يصل إلى 64 بكسل 8x8 بكسل
    • طبقة الخلفية
      • مرتبطة بشبكة
      • رائعة للعناصر الثابتة: المنصات والعقبات الكبيرة والديكورات
      • ذاكرة الفيديو كافية لتخزين مربعات 64 × 30 بحجم 8 × 8 بكسل
        • دقة داخلية حقيقية 512x240 ، مع إطار عرض 256x240
        • يدعم تمرير الأجهزة لتغيير إطار العرض 256x240
          • يتحكم تسجيل PPUSCROLL (العنوان 0x2005) في تحول إطار العرض في X / Y

بعد التعامل مع هذه النظرة العامة الموجزة للغاية ، دعنا ننتقل إلى الأكثر إثارة للاهتمام: كيف يعمل WideNES؟

الفكرة الرئيسية


في نهاية كل إطار ، ترسل وحدة المعالجة المركزية معلومات التغيير إلى PPU. وتشمل هذه المواقف العفوية الجديدة ، وبيانات المستوى الجديد ، والتي تعد حاسمة بالنسبة لـ WideNES ، وتعويضات إطار العرض الجديدة . نظرًا لأن WideNES يعمل في المحاكي ، فمن السهل جدًا بالنسبة لنا تتبع القيم المكتوبة في سجل PPUSCROLL ، مما يعني أنه من السهل جدًا حساب مقدار انتقال الشاشة بين أي إطارين!

حسنًا ، ماذا سيحدث إذا ، بدلاً من رسم كل إطار جديد مباشرة فوق الإطار القديم ، سيتم رسم إطارات جديدة متراكبة على الإطار السابق ، ولكن تم تحويلها إلى قيمة التمرير الحالية؟ بعد ذلك ، بمرور الوقت ، سيبقى جزء كبير بشكل متزايد من المستوى على الشاشة ، وبناء صورة كاملة للمستوى تدريجيًا!

للتحقق مما إذا كانت هذه الفكرة ذات قيمة ، قمت برسم التطبيق الأول بسرعة.

جارٍ التجميع ...
جارٍ الإطلاق ...
تحميل لعبة Super Mario Bros. ...

فويلا!


عملت!

يبدو أن ...



طريقة أخرى: لماذا لا تستخرج المستويات مباشرة من ملفات ROM؟


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

ماذا لو كانت هناك طريقة ما لاستخراج المستويات من NES ROMs الخام ؟!

هل يمكن أن توجد مثل هذه التقنية؟

حسنًا ، على الأرجح لا.

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

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

لاستخراج بيانات المستوى من ROM ، من الضروري تحديد أي أجزاء من ROM هي رمز (وليس بيانات) ، وهذا أمر صعب ، لأن العثور على جميع التعليمات البرمجية في ملف ثنائي يعادل مشكلة توقف !

تستخدم WideNES أسلوبًا أكثر بساطة: بدلاً من تخمين كيفية تعبئة اللعبة لبيانات المستوى في ROM ، تطلق WideNES اللعبة وتتابع الإخراج!



التمرير بعد 255


NES هو نظام 8 بت ، أي أن سجل PPUSCROLL يمكنه فقط تلقي قيم 8 بت. وهذا يحد من إزاحة التمرير القصوى إلى 255 بكسل ، أي الحد الأقصى لعدد 8 بت. ليس من قبيل المصادفة أن دقة شاشة NES هي 240 × 256 بكسل ، أي أن التحول بمقدار 255 بكسل يكفي فقط لتمرير الشاشة بأكملها.

ولكن ماذا يحدث عند التمرير أكثر من 255؟

أولاً ، تعيد الألعاب تسجيل PPUSCROLL إلى 0. وهذا يفسر سبب انتقال SMB إلى البداية عندما يتحرك ماريو بعيدًا إلى اليمين.

بعد ذلك ، للتعويض عن قيود PPUSCROLL 8 بت ، تقوم الألعاب بتحديث سجل PPU آخر: PPUCTRL (العنوان 0x2000). تحدد البتتان السفليتان من PPUCTRL "نقطة البداية" للمشهد الحالي بزيادات في وضع ملء الشاشة. على سبيل المثال ، تؤدي كتابة قيمة 1 إلى إزاحة إطار العرض إلى اليمين بمقدار 256 بكسل ؛ بينما تؤدي القيمة 2 إلى إزاحة إطار العرض بمقدار 240 بكسل. يتم دفع إزاحة PPUCTRL على المكدس باستخدام سجل PPUSCROLL ، والذي يسمح لك بتمرير الشاشة أفقيًا في 512 بكسل أو رأسيًا في 480 بكسل.

ولكن بناء ، هل هناك فقط ذاكرة فيديو كافية لشاشتين من المستويات؟ ماذا يحدث عند تمرير إطار العرض بعيدًا جهة اليمين و "تجاوز" VRAM؟ لمعالجة هذه الحالة ، تنفذ PPU الالتفاف: يتم طي جميع أجزاء إطار العرض خارج ذاكرة الفيديو المحددة ببساطة إلى الحافة المقابلة لذاكرة الفيديو.

هذا الطي ، إلى جانب التلاعب بالسجلات الذكية PPUSCROLL و PPUCTRL ، يسمح لألعاب NES بخلق وهم عوالم طويلة / واسعة بشكل لا نهائي! بفضل التحميل البطيء لجزء من المستوى خارج نافذة العرض والتمرير التدريجي فيه ، لا يدرك اللاعبون أبدًا أنهم داخل VRAM "يركضون في دوائر"!

يوضح الرسم التوضيحي الممتاز من ويكي nesdev كيف أن Super Mario Bros. يستخدم هذه الخصائص لإنشاء مستويات أطول من شاشتين:


دعنا نعود إلى السؤال الذي نناقشه: كيف يتعامل WideNES مع التمرير إلى ما بعد 256؟

حسنًا ، بصراحة ، يتجاهل WideNES سجل PPUCTRL تمامًا ويتتبع اختلاف PPUSCROLL بين الإطارات!

إذا قفز PPUSCROLL بشكل غير متوقع إلى حوالي 256 ، مما يعني عادة أن شخصية اللاعب قد تحركت يسارًا / لأعلى على الشاشة ، وإذا قفز بشكل غير متوقع إلى حوالي 0 ، فهذا يعني عادة أن اللاعب قد تحرك يمينًا / لأسفل على الشاشة.

على الرغم من أن هذا الدليل الإرشادي قد يبدو بسيطًا - وهو - في الواقع ، فإنه يعمل بشكل رائع!

بعد تنفيذ هذا الإرشادي ، Super Mario Bros. ، عملت Metroid والعديد من الألعاب الأخرى بشكل مثالي تقريبًا!

لقد شعرت بسعادة غامرة ، لذلك مضت قدما وحمّلت NES كلاسيكي آخر - Super Mario Bros. 3 ...


حسنًا ... ليست جميلة جدًا.

تجاهل عناصر الشاشة الثابتة


تحتوي العديد من الألعاب على عناصر ثابتة لواجهة المستخدم حول حواف الشاشة. في حالة SMB3 ، هذا عمود على اليسار وشريط حالة في أسفل الحالة.

بشكل افتراضي ، يتم أخذ عينات WideNES بزيادات 16 بكسل من حواف الشاشة ، أي أن جميع العناصر الثابتة في الحواف يتم أخذ عينات منها! ليس جيد!

للتغلب على هذه المشكلة ، تطبق WideNES القواعد والاستدلال التي تحاول التعرف على عناصر الشاشة الثابتة وإخفائها تلقائيًا.

بشكل عام ، تستخدم ألعاب NES ثلاثة أنواع مختلفة من عناصر الشاشة الثابتة: HUDs والأقنعة وأشرطة الحالة.

HUD - لا توجد مشكلة


إذا فرضت لعبة HUD على أعلى مستوى ، فمن المحتمل أن تتكون HUD من عدة نقوش متحركة. مثال: HUD في Metroid .

لحسن الحظ ، لا تتسبب مثل هذه HUDs في حدوث مشاكل ، لأن wideNES يتجاهل ببساطة طبقة العفريت. عظيم!

أقنعة - أسهل من أي مكان


يحتوي PPU على ميزة تسمح للألعاب بإخفاء أقصى 8 بكسل من طبقة الخلفية في أقصى اليسار. يتم تنشيطه عن طريق تعيين البت الثاني من التسجيل (العنوان 0x2001). تستخدم العديد من الألعاب هذه الميزة ، ولكن تفسير سبب قيامها بذلك يتجاوز نطاق هذه المقالة.

يعد التعرف على القناع المضمّن أمرًا بسيطًا للغاية: يتتبع wideNES فقط قيمة PPUMASK ويتجاهل أقصى 8 بكسل عند تعيين البت الثاني في التسجيل!

يبدو أن تنفيذ هذه القاعدة البسيطة قد أصلح مشكلة SMB3 :


... حسنا ، أو تم القضاء عليها تقريبا .

أشرطة الحالة هي الأصعب


نظرًا لقيود PPU في أي وقت على الشاشة ، لا يمكن أن يكون هناك أكثر من 64 نقوشًا متحركة ؛ علاوة على ذلك ، في أي وقت في كل خط نقطي لا يمكن أن يكون هناك أكثر من 8 نقوش متحركة. يمنع هذا التقييد المطورين من إنشاء HUDs معقدة من العفاريت ويجبرهم على استخدام أجزاء من طبقة الخلفية لعرض المعلومات.

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

يستخدم WideNES استدلالًا مختلفًا للتعرف على الأنواع المختلفة من لوحات الحالة ، ولكن لتوفير الوقت ، سأفكر في واحد فقط من الأكثر إثارة للاهتمام: تتبع IRQ في منتصف الإطار.

تتبع IRQ منتصف الإطار


على عكس وحدات معالجة الرسومات الحديثة ذات المخازن المؤقتة الكبيرة للإطارات الداخلية ، لا تحتوي وحدات معالجة الرسومات عمومًا على مخزن مؤقت للإطارات! لتوفير المساحة ، تقوم PPU بتخزين المشاهد كشبكة من 64x32 مربعات من 8x8 بكسل. بدلاً من الحساب المسبق لبيانات البكسل ، يتم تخزين المربعات كمؤشرات على ذاكرة CHR (ذاكرة الأحرف) ، والتي تحتوي على جميع بيانات البكسل.

منذ أن تم تطوير NES في الثمانينيات ، تم إنشاء PPU دون مراعاة تقنيات العرض الحديثة. بدلاً من عرض الإطار الكامل في نفس الوقت ، تقوم وحدة PPU بإخراج إشارة فيديو NTSC ، والتي يجب عرضها على شاشة CRT التي تعرض بكسل الفيديو بالبكسل ، خطًا بسطر ، من الأعلى إلى الأسفل ، من الأعلى إلى الأسفل ، من اليسار إلى اليمين.

لماذا كل هذا مهم؟

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

لشرح كيف يمكن لكتابة PPU متوسطة الإطار إنشاء أشرطة الحالة ، قمت بتسجيل تفريغ شريحة فيديو PPU و CHR Memory الأولية لإطار SMB3 واحد:


كل شيء يبدو على ما يرام ، لا يوجد شيء خاص ... ولكن فقط انظر إلى شريط الحالة! انها مشوهة تماما!

انظر الآن إلى نفس التفريغ الخام ، ولكن تم صنعه بعد السطر 196 ...


نعم ، يبدو المستوى فظيعًا ، لكن شريط الحالة يبدو رائعًا!

ما الذي يحدث هنا؟

يعين SMB3 جهاز ضبط الوقت لتشغيل IRQ (مقاطعة) بالضبط بعد تقديم خط البيانات النقطية 195. ويمرر الإرشادات التالية إلى معالج IRQ:

  • اضبط PPUSCROLL على (0،0) (بحيث يبقى شريط الحالة في مكانه)
  • نقوم باستبدال بطاقة التجانب في ذاكرة CHR (نرتب رسومات شريط الحالة)

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

دعنا نعود إلى wideNES: من خلال مراقبة جميع IRQs في منتصف الإطار وتذكر خط البيانات النقطية التي حدثت فيها ، يمكن لـ WideNES تجاهل جميع خطوط البيانات النقطية اللاحقة في السجل! إذا حدث IRQ في خط البيانات النقطية أعلى من 240/2 ، فسيتم تجاهل جميع الأسطر السابقة ، لأن الانقطاع المبكر لخط البيانات النقطية يعني أن شريط الحالة قد يكون في أعلى الشاشة.

بعد تنفيذ هذا الإرشادي ، Super Mario Bros. 3 حصل على الكمال!




لقد فكرت بإيجاز في إمكانية استخدام مكتبة رؤية الكمبيوتر ، مثل OpenCV ، للتعرف على لوحات الحالة (أو غيرها من المناطق الثابتة في الغالب من الشاشة) ، لكنني قررت التخلي عنها. إن استخدام مكتبة رؤية حاسوبية ضخمة ومعقدة وغير شفافة يتعارض مع مُثُل WideNES ، التي أحاول فيها استخدام قواعد واستدلالات مدمجة وبسيطة وشفافة للحصول على نتائج.



التعرف على المشهد


باستثناء بعض الأمثلة البارزة (على سبيل المثال ، Metroid ) ، لا تمر ألعاب NES عادةً في مستوى واحد ضخم لا يمكن فصله. على العكس من ذلك ، تنقسم معظم ألعاب NES إلى العديد من "المشاهد" المستقلة الصغيرة مع أبواب أو شاشات انتقالية بينها.

نظرًا لأن WideNES لا يتضمن مفهوم "المشاهد" ، تحدث الأشياء السيئة عند تغيير المشاهد ...

على سبيل المثال ، إليك أول انتقال من مشهد Castlevania ، حيث يدخل سيمون بلمونت إلى قلعة دراكولا:


واو ، كل شيء سيء! WideNES أعاد كتابة الجزء الأخير من المستوى بالكامل بالشاشة الأولى من المستوى الجديد!

من الواضح أن WideNES بحاجة إلى طريقة للتعرف على تغييرات المشهد. لكن أي واحد؟

التقطيع الإدراكي!

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

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

إنها بسيطة ، لكنها تعمل بشكل جيد!

على سبيل المثال ، انظر كيف تبرز التحولات بين المشاهد إذا قمت برسم التجزئة الإدراكية بمرور الوقت في The Legend of Zelda :


تستخدم WideNES حاليًا حدًا ثابتًا بين قيم التجزئة الإدراكية لإكمال الانتقال بين المشاهد ، ولكن النتيجة ليست مثالية. تستخدم الألعاب المختلفة لوحات مختلفة ، وهناك العديد من الحالات التي يعتقد فيها WideNES حدوث انتقال ، ولكن في الواقع لم يحدث. من الناحية المثالية ، يجب أن تستخدم WideNES قيمة عتبة ديناميكية ، ولكن حتى الآن ستستخدم القيمة الثابتة.

بعد تنفيذ هذا التوجيه الجديد ، اعترفت WideNES بنجاح بمدخل سيمون من Castlevania إلى القلعة وبناءًا على ذلك قماش جديد.


وبهذا القرار ، قمنا بوضع آخر قطعة رئيسية من أحجية WideNES.

بعد تنفيذ أبسط تسلسل ، تمكنت أخيرًا من تشغيل اللعبة لـ NES واللعب في عدة مستويات وإنشاء خرائط المستوى تلقائيًا!

ماذا ينتظر WideNES في المستقبل؟


يتكون WideNES من جزأين منفصلين: نواة wideNES ، وهي القواعد / الاستدلال الأساسي الذي تقوم عليه التقنية ، والتطبيق المحدد لـ wideNES داخل محاكي ANESE.

تحسين نواة WideNES


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

مطلوب أيضًا عمل إضافي للتعرف على عناصر الشاشة الثابتة.على سبيل المثال ، يحتوي Megaman IV على IRQ في منتصف الإطار ، ولكن لا يوجد شريط حالة ، ولهذا السبب يتجاهل WideNES عن طريق الخطأ الجزء الصلب من الملعب. على الرغم من أنه يمكن تصحيح هذه الحالة بالضبط اليدوي ، فمن الأفضل استخدام المزيد من الاستدلالات الذكية.

تقوم بعض ألعاب NES بتمرير الشاشة بطرق "فريدة". أحد الأمثلة البارزة هو The Legend of Zelda ، الذي يستخدم PPUSCROLL للتمرير الأفقي ، ولكنه يستخدم سجلًا مختلفًا تمامًا للتمرير الرأسي - PPUADDR. Zelda هي لعبة شائعة إلى حد ما ، لذلك تقوم شركة WideNES بتطبيق الاستدلال خصيصًا لـ Zelda. هناك ألعاب أخرى مع أوضاع التمرير "الفريدة" المماثلة ، والتي تتطلب أيضًا الاستدلال الفردي.

قد يكون من المفيد إيجاد طريقة ما "لغرز" المشاهد المتطابقة. على سبيل المثال ، إذا لعب المستخدم لعبة Super Mario Bros. المستوى 1 ، ولكن يزحف إلى الأنبوب للدخول إلى الكهف تحت الأرض بعملات معدنية ، سيقوم WideNES بإنشاء مشهدين منفصلين للمستوى 1: المشهد أ ، المستوى حتى يدخل ماريو المنطقة بالعملات المعدنية ، والمشهد ب ، المستوى ، من اللحظة عندما يخرج ماريو من الأنبوب ويصل إلى سارية العلم. إذا تمت إعادة تشغيل اللعبة ثم أعيد تشغيل المستوى 1 دون الدخول في الأنبوب ، فسيقوم WideNES ببساطة بتحديث المشهد A ، والذي سيحتوي على خريطة كاملة المستوى ، لكن المشهد B "سينقطع".

أخيرًا ، يجب على WideNES تتبع التحولات بين المشاهد. بدون هذه البيانات ، لن يكون من الممكن إنشاء رسم بياني للتحولات بين المشاهد لإنشاء خرائط العالم للألعاب التي لا تتكون من عالم واحد كبير.

تحسين تنفيذ WideNES في ANESE


يتم حاليًا تطبيق wideNES فقط في محاكي NES الذي كتبته تحت اسم ANESE. ANESE هو محاكي Spartan للغاية : معظم الخيارات مخفية خلف أعلام CLI ، وواجهة المستخدم الوحيدة التي تم تنفيذها هي أبسط تراكب اختيار الملف! لا يزال بعيدًا جدًا عن مستوى "الإنتاج".

وبصرف النظر عن عدم وجود واجهة المستخدم ، ANESE و wideNES ، لن يضر التحسينات في التوافق والسرعة. ANESE هو أول محاكي كتبته ، وهو ملحوظ!

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

من حيث السرعة ، ANESE و WideNES ليست مثالية ، وحتى على أجهزة الكمبيوتر القوية نسبيًا ، يمكن أن ينخفض ​​الأداء في بعض الأحيان إلى أقل من 60 إطارًا في الثانية! تحتاج ANESE و wideNES إلى تنفيذ العديد من التحسينات. بالإضافة إلى التحسين العام لنواة ANESE ، هناك حاجة إلى تحسين تسجيل إطار WideNES وعرض الخريطة وأخذ عينات التجزئة.

الخلاصة


في المقالة ، تحدثت عن الجوانب الرئيسية لـ wideNES ، ولكن لم أستطع وصف العديد من الميزات الصغيرة. على سبيل المثال ، يخزن WideNES خريطة التجزئة الحقيقية وقيم التمرير لكل إطار ، والتي يتم استخدامها لتمكين تكرار المشاهد. هذا والعديد من الميزات الأخرى موصوفة في كود المصدر المعلق على نطاق واسع لـ wideNES ، المنشور على صفحة مشروع wideNES .

كان العمل على wideNES تجربة رائعة حقًا ، ولكن مع اقتراب الفصل الدراسي الجديد في جامعة Waterloe ، أشك في أنه في المستقبل القريب سوف أكون قادرًا على الاستمرار في تطوير wideNES. في الوقت الحالي ، تعمل الوظائف الرئيسية لـ WideNES ، ويسعدني أنني تمكنت من كتابة هذا المنشور واصفاً بعض تقنياته!

جرب استخدام wideNES وشارك مشاعرك! تنزيل ANESE ، إطلاق Super Mario Bros. ، The Legend of Zelda أو Metroid ، ولعبها بطريقة جديدة!

Source: https://habr.com/ru/post/ar421555/


All Articles