bsnes-mt

bsnes-mt — улучшенная версия bsnes — точного эмулятора 16-битной игровой приставки SNES (Super Nintendo). Целочисленное масштабирование, PNG-скриншоты, точное соотношение сторон и проч.

Улучшения по сравнению с bsnes

  • Целочисленное масштабирование как по вертикали, так и по горизонтали.
  • Сохранение скриншотов в сжатом формате PNG вместо несжатого BMP.
  • Точное соотношение сторон 4:3 вместо 64:49 при коррекции в режимах «Center» и «Scale».
  • Драйверы не сбрасываются после падений, для сброса предусмотрен параметр командной строки.
  • Более удачные настройки по умолчанию: VSync, эксклюзивный полноэкранный режим, отключённое размытие.
  • Доступен русский перевод пользовательского интерфейса.
  • Повышенное удобство, исправление ошибок и проч.

Целочисленное масштабирование по обеим осям

Новый режим «Целочис­ленное масштаби­рование» («Настройки» → «Изображение» → «Целочис­ленное масштаби­рование») («Settings» → «Output» → «Pixel-Perfect») осуществляет целочисленное масштабирование (integer scaling) как по вертикали, так и по горизонтали, даже при включённой коррекции соотношения сторон. Благодаря этому все пикселы имеют в точности одинаковый размер, и исключается дрожание пикселов («pixel shimmering»). Целочис­ленное масштаби­рование включено в bsnes-mt по умолчанию. Используется авторская библиотека IntegerScaling.

При включённой коррекции соотношения сторон фактическое соотношение сторон может отличаться от идеального 4:3. Наиболее высокая точность соотношения сторон и наиболее полное использование площади экрана достигаются на мониторах разрешением QHD (2560×1440) и 4K (3840×2160). На мониторах разрешением QHD и 4K высота экрана используется на 93%. Соотношение сторон на QHD-мониторе идеальное, а погрешность на 4K-мониторе составляет менее 5% и почти незаметна на глаз. Наименее пригодны для целочисленного масштабирования SNES-игр дисплеи Full HD (1920×1080): высота экрана используется лишь на 83%, а погрешность соотношения сторон составляет более 7% и заметна на глаз.

Оригинальный bsnes в режиме «По центру» («Center») при включённой коррекции соотношения сторон использует целочисленное масштабирование по вертикали, но горизонтальный масштабный коэффициент обычно получается дробным в стремлении к точному соответствию соотношения сторон целевому. Но при дробных масштабных коэффициентах алгоритм «По соседним» («Ближайший сосед», «Nearest Neighbour»), используемый при отключённом размытии, приводит к тому, что разные пикселы в строке имеют разные ширины, что приводит к эффекту дрожания пикселов (pixel shimmering, ripple effect, jitter) при горизонтальном движении объектов в игре.

См. также
  • IntegerScaler — программа для целочис­ленного масштаби­рования игр в Windows 7+.
  • SmartUpscale — браузерное расширение для устранения размытия изображений на веб-страницах.

Точные пропорции в режимах «Center» и «Scale»

  • Точное соотношение сторон 4:3 при включённой коррекции соотношения сторон («Настройки» → «Изображение» → «Коррекция соотношения сторон») («Settings» → «Output» → «Aspect-Ratio Correction») в режимах «По центру» («Center») и «Масштабирование с сохранением пропорций» («Scale»). Оригинальный bsnes использует ошибочное соотношение 64:49 (8:7 в квадрате), т. к. определяет ширину изображения умножением исходной ширины изображения на исходное же соотношение сторон 8:7 (256:224), что даёт соотношение сторон примерно 1,3 вместо 1,333.
  • Более точный алгоритм коррекции соотношения сторон в режимах «По центру» и «Масштабирование с сохранением пропорций», использующий округление ширины отмасшта­бированного изображения. Оригинальный bsnes вычисляет скорректированную ширину ещё до вычисления отмасштабированных размеров, при этом не округляет полученное дробное значение, а отбрасывает дробную часть, в результате погрешность выше, чем при округлении, и растёт пропорционально масштабному коэффициенту.

Скриншоты: PNG, автосоздание папки, именование по дате

  • Скриншоты сохраняются в формате PNG со сжатием без потерь качества. Благодаря этому файлы скриншотов имеют многократно меньший объём по сравнению с несжатым форматом BMP, который используется в оригинальном bsnes. Скриншот в обычном для SNES разрешении 256×224 в формате BMP имеет фиксированный объём 168 КБ. Объём скриншотов в формате PNG зависит от сложности конкретного изображения, разница в объёме по сравнению с BMP может достигать десятков и даже сотен раз. Например, PNG-скриншот экрана с логотипом игры «The Legend of Zelda» занимает 9 КБ — в 18 раз меньше этого же скриншота в формате BMP. Используется авторская библиотека PizzaPNG.
  • Указанная в настройках эмулятора папка для скриншотов («Настройки» → «Пути» → «Скриншоты») («Settings» → «Paths» → «Screenshots») создаётся автоматически, если не существует. Оригинальный bsnes в этом случае не сохраняет скриншот. Автоматическое создание папки полезно, например, если она находится на виртуальном RAM-диске, содержимое которого пропадает при каждой перезагрузке компьютера. Подавляющее большинство скриншотов подлежит удалению, поэтому их временное хранение на RAM-диске вполне имеет смысл.
  • Скриншоты сохраняются в подпапку, имя которой совпадает с именем ROM-файла игры. Оригинальный bsnes включает имя ROM-файла в имя файла каждого скриншота.
  • Используется универсальная схема именования скриншотов без ограничения их максимального количества. Файлы скриншотов именуются согласно дате и времени снятия скриншота. Если файл существует, в конец имени нового файла добавляется трёхзначное количество миллисекунд. Если и такой файл существует, то добавляется числовой индекс начиная с 2 с неограниченным возрастанием. Например, если по умолчанию файл был бы назван 2020-04-15 10-15-42.png, то при существовании такого файла имя нового файла будет иметь вид 2020-04-15 10-15-42-123.png. Если и такой файл существует, имя файла будет иметь вид 2020-04-15 10-15-42-123-2.png. Оригинальный bsnes использует в качестве имени файла скриншота трёхзначный порядковый номер, ограниченный диапазоном 1—1000, после достижения верхней границы которого бесконечно перезаписывается файл с одним и тем же именем 000.bmp, всякий раз затирая предыдущий скриншот.

Драйверы не сбрасываются после падений

  • Бэкенды (драйверы, drivers) теперь не сбрасываются после непредвиденного завершения работы программы («падения», crash), падения не отслеживаются, и файл настроек не перезаписывается дополнительные два раза при каждом запуске эмулятора только лишь с целью отслеживания падений. Проблема с выбранным драйвером — не единственная возможная причина падений, поэтому сброс драйверов после каждого падения является излишним и неудобным.
  • Добавлен параметр командной строки --resetdrivers для явного сброса драйверов-бэкэндов, когда это необходимо. При запуске программы с этим параметром драйвера сбрасываются, и сразу открывается окно настроек.

Списки недавних игр и быстрых сохранений

  • Увеличено с 9 до 25 максимальное количество элементов в списках недавних игр («Файл» → «Открыть недавнюю игру») («File» → «Open Recent Game») и быстрых сохранений («Инструменты» → «Сохранить состояние» / «Загрузить состояние») («Tools» → «Save State» / «Load State»).
  • Улучшен список недавних игр («Файл» → «Открыть недавнюю игру») («File» → «Open Recent Game»):

    • пустые элементы теперь не выводятся;
    • пункт очистки списка и разделитель перед ним выводятся только при наличии недавних игр в списке;
    • если недавних игр нет, то выводится только один пункт, сообщающий об этом — «(Нет недавних игр)» («(No recent games)»).

Настройки по умолчанию

Изменены настройки по умолчанию:

  • отключено размытие («Настройки» → «Шейдер» → «Нет» вместо «Размытие») («Settings» → «Shader» → «None» вместо «Blur»), неуместное при цело­численном масштабировании;
  • включена вертикальная синхронизация (VSync) («Настройки» → «Драйверы» → «Видео» → «Синхронизация») («Settings» → «Drivers» → «Video» → «Synchronize»), служащая для предотвращения разрывов кадров (screen tearing);
  • включён эксклюзивный (exclusive) полноэкранный режим («Настройки» → «Драйверы» → «Видео» → «Эксклюзивный режим») («Settings» → «Drivers» → «Video» → «Exclusive mode»), уменьшающий задержку ввода (лаг, input lag);
  • включено использование стандартного для Windows интерфейса открытия файлов («Настройки» → «Эмулятор» → «Общие» → «Использовать стандартные диалоги открытия файлов») («Settings» → «Emulator» → «Options» → «Use native file dialogs») вместо собственных реализаций, встроенных в программу. Собственные реализации работают намного медленнее, а также не поддерживают переход вперёд/назад с помощью дополнительных боковых кнопок мыши.

Русско­язычный интерфейс (англо­язычный тоже доступен)

Помимо используемого по умолчанию английского языка и частичного японского перевода, пользова­тельский интерфейс почти целиком переведён на русский язык.

По умолчанию язык выбирается авто­матически на основании языка опера­ционной системы. Можно прину­дительно включить опреде­лённый язык с помощью параметра командной строки --locale. Распознаются три кода языков:

  • ru — русский;
  • en — английский;
  • jp — японский.

Например, --locale=en включает английский язык даже при запуске под русско­язычной версией Windows.

Используемый механизм локализации позволяет легко переводить интерфейс на другие языки с помощью единого файла: bsnes-mt/strings.h. Если какая-то строка не переведена, вместо неё используется исходная англоязычная строка, что даёт возможность переводить интерфейс частично.

Прочее

  • Пункты открытия/закрытия игр и выхода из программы перенесены из меню «Система» («System») в традиционное меню «Файл» («File»).
  • Добавлен обход (workaround) ошибки (бага) bsnes, из-за которой окно программы было не видно, если перед запуском программы был изменён системный масштаб и система не была перезагружена.
  • Теперь не сбрасывается размер окна при установке и снятии галок в меню «Настройки» («Settings)»:

    • «Коррекция соотношения сторон» («Aspect-Ratio Correction»);
    • «Показать overscan-область» («Show Overscan Area»);
    • «Показать строку состояния» («Show Status Bar»).

    В сбросе размера окна при этих действиях нет смысла.

  • В меню «Настройки» («Settings») добавлен пункт «Открыть папку настроек» («Open Settings Folder»), открывающий папку, содержащую файл настроек программы, который может храниться в одном из трёх мест, два из которых труднодоступны. Это позволяет легко создать резервную копию файла настроек или при необходимости (например, при аномалиях в работе программы) удалить его.
  • Пункт-галка «Aspect Correction» меню «Settings» → «Output» в англо­язычном интерфейсе переименован в «Aspect-Ratio Correction» (добавлено «-Ratio» после «Aspect»). «Aspect Ratio» и «Aspect» — не синонимы.
  • Фон логотипа SameBoy в окне «О программе SameBoy» («About SameBoy») сделан прозрачным; объём файла логотипа уменьшен в 4 раза.
  • Удалён ненужный пробел перед многоточием в пунктах меню.
  • Некоторые длинные строки во всплывающих сообщениях разбиты на две, чтобы предотвратить их усечение при отображении.
  • Специфичный для компилятора код частично заменён на переносимый стандартный код:

    • в методе Emulator::Audio::process() (файл bsnes/emulator/audio/audio.cpp);
    • в функции nall::chrono::nanosecond() (файл nall/chrono.hpp);
    • тип ssize_t заменён на intmax_t.
  • Для хранения настроек bsnes-mt используется собственный файл, независимый от обычной версии bsnes.