Как я подружил PlayStation 2 и PlayStation Portable (спойлер — объединил в один эмулятор)

Привет читателям. В прошлом году я опубликовал свой хобби-проект Красный Омега PS2 эмулятор. Идея была в адаптации управления оригинального эмулятора PCSX2 для игр на Surface Pro через Touch Screen.
Оригинальный код PCSX2 эмулятора был переписан в форме модуля DLL, загружаемый в C# код с графическим интерфейсом на WPF. Проект получился работоспособным и удачным — Final Fantasy X и Final Fantasy XII пошли «на ура». Но полгода назад я наткнулся на ссылку на Valkyria Chronicles 4 в Steam. Первую Valkyria Chronicles я покупал на диске и мне «зашла», но есть вопрос — где вторая и третья!?! Ответ нашёлся быстро — эти продолжения выходили только на игровых консолях. Самой доступной оказались версии для PlayStation Portable — через PPSSPP эмулятор. На смартфоне неплохо, но на Surface Pro мне не понравилось управление через Touch. Да и переключаться с Omega Red на PPSSPP, и обратно не охота. И тут возникла «безумная» идея — переписать оригинальный код PPSSPP в форме модуля DLL!!! И превратить Omega Red в ПЛАТФОРМУ для игр PlayStation 2 и PlayStation Portable!!!


Сказать легко, но сделать намного сложнее. Оригинальный PPSSPP эмулятор разрабатывается как Open Source проект и доступен в форме полного кода для изучения и модификации. Код интересен и может быть запущен на множестве графических API: OpenGL, DirectX9, DirectX11, Vulkan. В добавок, он имеет встроенную GUI. Но архитектура PPSSPP более «ясная» чем у PCSX2 — больше модульности и зависимости упрощены. Главным ключём к реализации моей идеи оказалась возможность загрузки игрового диска и сохранения в форме аргумента для программы. Решение элементарное — переписать входную функцию EXE в ЭКСПОРТИРУЕМУЮ функцию DLL. Конечно, возникнут проблемы с созданием второго «окна», перенаправлением выхода графического рендерера на WPF графический контекст, подключением Touch кода, и т.д. и т.п., но всё это я уже решал, когда переписывал код для PCSX2 — работоспособные шаблоны уже есть.
Каков результат — решение работает! Удалось объединить два столь разных эмулятора в одно решение с бесшовным переключением между играми для разных эмуляторов. Результат можно оценить на видео:

В дополнение, я хотел бы упомянуть следующие изменения, по сравнению с первым релизом Красный Омега PS2 эмулятор:
1. Изменена цветовая схема — в комментариях было указано неудобство от цветовой гаммы интерфейса — красного. Странное неудобство — но я решил добавить инвертированную гамму «Синий»:
Как я подружил PlayStation 2 и PlayStation Portable (спойлер — объединил в один эмулятор)

2. Тесселяция — для игр на PCSX2 добавлена функция «Tessellation» из DirectX 11 — это функция позволяет увеличить количество полигонов для моделей:
image

Тесселяция выбирается из опции «Rendering schema»
image

DEFAULT
image

TESSELLATED
image

DEFAULT
image

TESSELLATED
image

3. FXAA — для игр на PCSX2 добавлена функция «Включить FXAA» для удаления «Ступенек» по границам полигонов — решение работает не идеально, но работает:
image

4. Быстрое сохранение — сохранение состояния эмулятора одной командой:
image

5. Контроль громкости:
image

В настоящий момент программа доступна по ссылке: Omega Red и представлена на GitHub: OmegaRed

 
Источник

Читайте также