Перенесення Quake на Game Boy Advance здавалося б неможливим, але Ренді Ліндену вдалося це зробити. Ось як.
Game Boy Advance — портативна ігрова консоль, створена Nintendo. Він був випущений в Японії в 2001 році і став наступником Game Boy Color. Він мав ARM7TDMI з тактовою частотою 16,78 МГц, 32 Кб внутрішньої робочої оперативної пам’яті, 256 Кб зовнішньої оперативної пам’яті та 96 Кб VRAM. Це не найпотужніша машина, але є багато ігор для КПК, які багато хто збереже в пам’яті. Однією грою, яка так і не побачила світ для пристрою, був порт прототипу Quake, гри, розробленої id Software, яка допомогла визначити жанр шутерів від першої особи, який ми знаємо сьогодні.
Quake — це неймовірно деталізована гра з фантастичним саундтреком і захоплюючим геймплеєм, і, як і DOOM, її портовано практично на всі пристрої, які тільки можна придумати. Його перенесення на Game Boy Advance особливо неймовірне, оскільки воно не підтримує 3D-графіку, і Nintendo спеціально рекламувала портативний комп’ютер як двовимірний ігровий процес. Однак це не завадило Ренді Ліндену розробити власний порт.
Якщо ви не знайомі з Лінденом, він відомий як розробник обох bleem! (емулятор PlayStation) і SNES-порт DOOM, досягнення, про яке Джон Ромеро, співзасновник id Software, одного разу сказав в інтерв’ю виданню Shacknews він не думав, що це можливо. Вміння Ліндена в розробці довело, що якщо хтось і зможе втілити Quake на Game Boy Advance, то це, мабуть, він.
Цей порт з’явився завдяки тому, що Лінден випустив його в рамках проекту Forest of Illusion. Forest of Illusion — це проект, спрямований на збереження історії ігор Nintendo та Linden простягнув руку, щоб розповсюдити копію порту Quake, яку він знайшов на флеш-карті на 256 МБ у своєму володіння.
Ми хотіли б подякувати Ренді Ліндену за те, що він присвятив час, щоб відповісти на наші запитання та забезпечити технічну точність цієї статті. Ми також хотіли б подякувати Сучасний вінтажний геймер за те, що дозволив нам використовувати будь-які необхідні кадри з його відео. Цей порт не має офіційного відношення до id Software або ZeniMax і був розроблений Linden як сольний проект.
Порт Quake для Game Boy Advance
Технічно кажучи, це диво, що Quake навіть може працювати на рівні, який він досягає на Game Boy Advance. Він працює з хорошою частотою кадрів і підтримує правильне освітлення та колірну палітру оригінальної гри Quake. Все в 3D, включаючи зброю та монстрів. Ігри на Game Boy Advance досягали 3D-графіки, як правило, за допомогою спрайтів, але це була справжня справа. Він не використовує відведення променів так, як це робили інші 3D-ігри на портативному комп’ютері, і навіть досягає мети світлові ефекти на попередньо відрендерених об’єктах за допомогою трюку зміни палітри для досягнення ілюзії динамічності освітлення.
Щоб було зрозуміло, цей порт не є повною грою, а прототипом, який Лінден мав намір передати в id Software, коли його буде завершено для випуску. Однак популярність Game Boy Advance почала падати, і натомість користувацький движок, написаний Лінденом, пізніше став рушієм іншої гри, повністю розробленої Лінденом — Cyboid. Лінден каже нам, що «велика частина коду» все ще є оригінальним кодом ARM із версії Game Boy Advance. Якщо ви хочете спробувати Cyboid, старіша версія доступна в магазині Google Play, але офіційний APK тепер поширюється на Магазин додатків Amazon оскільки в грі багато низькорівневого 32-розрядного коду.
Ціна: безкоштовно.
3.3.
Лінден також поділився з нами відео свого коду, запущеного на iPod Video, який був однією з найперших версій Cyboid. Він був побудований на тому ж коді двигуна, який використовувався для його перенесення Quake на Game Boy Advance.
Порт Quake для Game Boy Advance не містить жодних офіційних активів гри, оскільки Linden не звернувся до id Software або ZeniMax щодо розповсюдження версії E1M1, яка містить офіційний Quake активів.
Гра, яка зараз розповсюджується, також є збіркою для налагодження. Утримуючи клавішу R під час завантаження, ви перейдете прямо до другої карти гри, а утримуючи ліворуч на D-pad, ви перейдете до третьої. Обмін картою також доступний, коли гравець помре, і монстри не нападуть на гравця, доки гравець не вистрілить у них першим.
Що стосується музики, у демонстрації використовуються загальнодоступні файли .S3M, а звуковий мікшер обробляє як стереомузику, так і звукові ефекти.
Технічні межі
Коли мова зайшла про Game Boy Advance, існувала низка обмежень, які зробили це складним перенесенням. Одними з найбільших перешкод були низька тактова частота, відсутність можливостей 3D-графіки КПК і відсутність блоку з плаваючою комою (FPU). На цьому шляху було багато інших, але це були особливі больові точки, які Лінден окреслив мені як проблемні. Перш ніж приступити до цього, важливо зрозуміти компонування Game Boy Advance.
Game Boy Advance має три набори оперативної пам’яті: один — це внутрішня робоча оперативна пам’ять (IWRAM), інший — зовнішня робоча оперативна пам’ять (EWRAM), а третій — відеопам’ять (VRAM). 32 Кб IWRAM використовуються для зберігання інструкцій ARM для швидкого виконання, тоді як 256 Кб EWRAM є оптимальним для зберігання лише інструкцій Thumb і менших фрагментів даних. як Родріго Копетті зазначає, EWRAM може мати доступ до шести разів повільніше, ніж IWRAM. Більшість пам’яті у формі EWRAM доступна лише через 16-бітну шину, незважаючи на те, що Game Boy Advance продається як 32-бітний КПК. Доступ до IWRAM можна отримати через 32-розрядну шину. Обсяг відеопам’яті Game Boy Advance становить 96 Кб, і, хоча вона в основному призначена для зберігання графічних даних, вона міститься в карті пам’яті ЦП і може використовуватися як звичайне сховище пам’яті.
Thumb інструкції є підмножиною 32-розрядних інструкцій ARM і є набором інструкцій, закодованих у 16-розрядних словах. Вони мають усі переваги 32-розрядних інструкцій, не займаючи багато місця, що робить їх ефективними для оптимізованої розробки. Це означає, що доступ до EWRAM повільніший, інструкції Thumb, будучи ефективними, часто можуть бути такими ж швидкими, як збережені інструкції ARM в IWRAM, хоча недоліком інструкцій Thumb є те, що іноді не існує еквівалента Thumb інструкції ARM, яку ви хочете виконувати. EWRAM використовувався для зберігання вихідних даних логіки 3D-математичного перетворення, яка була в основному списком ребер багатокутника, які потім розгорталися скан-рядок за скан-рядком за допомогою коду растеризації.
Як розповідає мені Лінден, найскладнішою та найважчою частиною всього порту був сканер візуалізації. Він складається з понад 10 000 рядків високооптимізованого асемблерного коду ARM, який призначений для малювання набору пікселів у VRAM. Рендерер сканування використав більшу частину 32 Кб IWRAM. Краї, найближчі до камери, активні та відтворені, і це, по суті, велике дерево двійкового розділення простору (BSP). VRAM використовувався для зберігання результатів полігонального перетворення в крайові таблиці, оскільки не вистачало IWRAM, але VRAM на Game Boy Advance все ще швидший, ніж EWRAM. Тут також зберігалася та демонструвалася графіка.
Він присвятив багато часу зосередженню на оптимізації, щоб забезпечити якнайшвидший час виконання. Три речі, які він зробив, щоб прискорити час виконання, включали наступне:
- Самостійно змінив код перед його виконанням, тому було потрібно менше інструкцій
- Використовував серію пошукових таблиць для таких речей, як зворотна величина, синус, косинус, тангенс тощо.
- Перемкнуто «режим» ЦП, щоб отримати доступ до додаткових регістрів (які схожі на «змінні») без необхідності зберігати та відновлювати значення регістрів.
Перемикання режимів ЦП для отримання додаткових регістрів є неймовірно розумним маневром, який забезпечує швидкий доступ до значень, близьких до ЦП, щоб їх можна було отримати за один такт. Як сказав мені Лінден, було можливо перемикати регістри та отримувати значення за один такт, на відміну від збереження значення в оперативній пам’яті Game Boy Advance, яке займає більше часу. Сам центральний процесор є процесором 16,78 МГц, тобто він може виконувати 16780000 циклів за секунду. Це звучить як багато, але коли вам потрібно обчислити та намалювати кожен піксель на екрані, вони швидко складаються, і стає важливим скоротити якомога більше операцій.
Вище наведено список загальних регістрів чіпсета ARM7TDMI, який знаходиться всередині Game Boy Advance. Як правило, розробники отримували доступ до реєстрів лише в режимі «Система та користувач» і вдавалися до використання звичайних змінних поза цим режимом. Однак він використовував регістри у всіх семи режимах чіпсета, і найкраща частина цього полягає в тому, що режими перемикання все ще зберігають значення в регістрах інших режимів, щоб він міг перемикатися між ними їх.
Цікаво, що Лінден також згадав, як його метод зміни банку виявив помилку в емуляторі Nanoboy Advance. Як виявилося, цей емулятор не підтримував використання інших режимів процесора для збереження в регістрах і перемикання, а його демо-версія Quake була першою відомою грою, яка дійсно це робила.
Лінден поділився з нами фотографією деяких нотаток, які він створив, і пояснив, як він оптимізував свої обчислення з плаваючою комою за відсутності належного FPU.
Наведене вище зображення є тим, яким Лінден поділився з нами зі своїх нотаток, і що особливо цікаво, так це «розраховані інструкції циклу ARM». Він винайшов спосіб оптимізації циклів для обчислень, щоб він міг зменшити кількість тактів для обчислень. Як він мені це описав, 8-розрядне число можна помножити за один такт, 16-бітне число за два такти, 32-розрядне число за три такти і 64-розрядне число за чотири такти. .
«Було два або три етапи виконання [в процесорі ARM]. Скажімо, наприклад, я множу регістр один на регістр два і поміщаю результат у регістр три. Якби я знав, що регістр два є 16-бітним числом замість того, щоб казати помножити регістр один на регістр два, я перевернув би це, і я б сказав помножити регістр два на регістр один, тому що це заощадило б мені годинник цикл."
Він сказав мені, що він зробив це для того, щоб вичавити з Game Boy кожну частинку продуктивності Попередньо, оскільки цикл годинника, збережений тут і там, справді додається, коли виконується багато обчислень виконується. Щодо коду, що самозмінюється, я попросив Ліндена пояснити це.
«Програма надходить із [сховища], вона переносить великий блок програми у внутрішню оперативну пам’ять для виконання, тому що це швидше. Кожен доступ до оперативної пам’яті відбувається набагато, набагато повільніше, тому я роблю DMA [прямий доступ до пам’яті] великого блоку з ПЗУ в оперативну пам’ять, а потім зміню фактичний код програми. Наприклад, ARM має можливість зміщувати операнди вліво або вправо або може маскувати певні біти як частину набору інструкцій. Інструкція визначає, які біти ви збираєтеся маскувати або на скільки бітів ви збираєтеся зсунути. Отже, я генерував би код, який би змінював те, що саме збиралося виконати, залежно від того, скільки бітів мені потрібно було зсунути. Інший приклад стосується тривимірного множення матриць. Тут задіяна ціла купа множень. Я б згенерував фактичні інструкції, які виконують множення у внутрішній оперативній пам’яті, а потім виконав би їх, щоб код створював частини себе під час виконання».
Код, який самостійно змінюється, має свої недоліки, зокрема, коли мова йде про налагодження. Це також усуває потребу в інструкціях розгалуження, коли код переходив би до іншої послідовності виконання та може позбавити основний потік дорогоцінного часу обчислень. Лінден також сказав нам, що пошукові таблиці ідеально вирівняні в ПЗП, тож вони є ідеальним кратним восьмибітному значенню, зміщеному вліво. Розмір таблиці пошуку є величезним і не вміщується в оперативну пам’ять, а вирівнювання також дозволяє уникнути необхідності додаткової інструкції завантаження для отримання базової адреси таблиці.
Загалом остаточний прототип розробляли майже два роки.
Майбутнє порту Quake Ренді Ліндена
Я запитав Ліндена, що станеться з майбутнім портом Quake, і він сказав мені, що ставить звернутись до ZeniMax та id Software щодо випуску версії з офіційним Quake активів. Він також сказав мені, що колись опублікує вихідний код, але наразі він не збирається, оскільки для цього потрібен старіший комп’ютер.
Я запитав Ліндена, чому він вибрав Quake, і він сказав мені, що йому подобається ця гра, і йому подобається проблема, пов’язана з тим, що це «неможливий проект», оскільки він був позаду його порту DOOM для SNES. Він також зазначив, що хоча він не вірить, що всю гру можна було перенести через обмеження простору, переважна більшість гри могла бути на тому самому двигуні.
Якщо вам цікаво перевірити Quake для Game Boy Advance, обов’язково подивіться його випуск на Forest of Illusion, який ви можете переглянути нижче.
Завантажити з Forest of Illusion