Автор Тема: Попытка написать фронтенд Sega MD / Sega CD под Windows  (Прочитано 789 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн free.gen

  • Пользователь
  • Сообщений: 297
  • Пол: Мужской
    • Просмотр профиля
Пишу просто чтобы поделиться, до чего может довести кризис среднего возраста. А заодно, может быть, найти единомышленников для проекта (если это вообще кому-то покажется дееспособным). Сам не являюсь кодером, максимум что освоил — веб-разработку и простенькое ПО.
В общем, в качестве эксперимента решил проверить AI-редактор Cursor. Потратил на генерацию энное количество учетных записей и месяц времени, и получилось то что получилось.

Концепция фронтенда
Минималистичный интерфейс чисто под любимую на пространствах бывшего СНГ SMD и, возможно, немножко Mega CD. Для эмуляции использовать самое актуальное ядро — Genesis Plus GX. В настройках использовать только самое необходимое и характерное для SMD. Сделать просто хороший полноэкранный OneSystem ретроарч с обложками и базовыми метаданными. Чтоб без пердолинга — запустил и играй. И при этом чтоб красиво. Что-то типа Sega MD Mini, но на ПК.

Инструментарий — Cursor App + LOVE2D
Cursor App задуман как AI-ассистент, чтобы помочь прогерам выполнять рутинные задачи, но на практике он может помочь и такому не программисту, как я, написать с нуля сабж.
LOVE2D — движок (фреймворк) для языка Lua. Имеет как плюсы, так и минусы. Для меня главный плюс в том, что не надо настраивать среду разработки, а еще я однажды уже модил фронтенд на этом же LOVE2D. Можно прям сырцы запускать. Легко собрать приложение, хотя повторюсь, можно и так запускать через батник без сборки.
Было бы лучше выбрать родной для libretro C++, но это для меня совсем уж темный лес.

Что реализовано сейчас

-Вывод изображения
Только целочисленное масштабирование в двух возможных для ядра параметрах (PAL и NTSC).
PAL на широких мониторах смотрится более удобоваримо. Многие объекты в игре при таком соотношении сторон имеют правильные формы кругов, квадратов и т.п. Для любителей NTSC есть NTSC, который по сути является около 4:3.

-Фильтры
Есть blargg ntsc filter (только композит и тот для дизеринга). Встроенные фильтры, они же шейдеры — есть возможность прикрутить шейдеры glsl, на данный момент внедрил шейдер crt-easymode.glsl прямо в код + билинейная фильтрация. Если очень коротко — love2d не сможет в навороченные slang шейдеры. Для этого нужно было писать на плюсах, а это для моего ума — высшая магия.
Была попытка сделать комбинацию из gdapt (для дизеринга) и crt-easymode, но gdapt не удалось сделать толковым. Он то все смешивает, и получается мыло, то не совсем все, и получается полудизеринг. Так что на данный момент реализовано все минимально в этом плане. Чтобы реализовать самые толковые фильтры — нужен переезд на плюсы, поэтому в плане шейдеров все будет аскетично.

-Звук
Он тут есть, и на этом все. Наблюдаются проблемы с синхронизацией иногда, пока не понятно из-за чего.

-Управление
При первом включении фронтенд предлагает вам забиндить кнопки ABCXYZ и т.д. Далее все это дело просто работает, как и задумано, без дополнительных настроек и ремапов. Можно настроить как одного, так и двух игроков.
Настройки управления (имя + ID геймпада + маппинг) сохраняются в конфиг в директории приложения. В него же позже будут подтягиваться другие настройки.

-Функции ядра
Сохранение и загрузка SRAM
Сохранение и загрузка квик-сейвов (1 слот)
Перемотка вперед/назад (по горячим клавишам)

Проблемы
Прежде чем внедрять что-то еще и полировать результат, решил плотно потестировать производительность, и понял, что не так уж все радужно, как казалось поначалу. Наблюдаю иногда рассинхрон звука. Если пытаться мониторить с FPS Monitor, то еще и микрофризы появляются. При включении настройки VDP=50Hz наблюдается неравномерная скорость музыки. Не форсится частота экрана на монитор. У меня он 180 Гц, 180 и показывается всегда.

В общем, самая базовая база, а именно правильная работа с ядром, видимо, реализована на троечку. И никакой анализ через нейросети и попытки что-то улучшить в этом плане меня уже никуда не приводят. Это опять же очень сложный для меня раздел, так что я даже в теории не могу представить, как это все вообще должно быть организовано и подходящий ли вообще выбрал путь.

Так зачем, собственно, пишу это. Возможно, среди нас есть умельцы, кто хоть как-то понимает — как должно работать ядро. Как правильно все сделать и оптимизировать. Если вам интересно, можно попробовать вытащить это, и, может быть, получится нужная и интересная штука. А если нет — я еще попробую какое-то время, но скорее всего заброшу. Ибо уперся в потолок своих мозгов. Возможно не стоило вообще на этом lua писать. Очень много вопросов.  :D

Весь код разбит на модули. Исходники пока не хочу публиковать, уж слишком там все страшно. Хочу сперва изучить интерес.
Не исключаю, что идея тупая лезть в такое без навыков вообще.