bsnes-mt

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

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

  • Цело­численное масштаби­рование как по вертикали, так и по горизонтали.
  • Сохранение скриншотов в сжатом формате PNG вместо несжатого BMP.
  • Точное соотношение сторон 4:3 вместо 64:49 при коррекции в режимах «Center» и «Scale».
  • Много­язычный пользова­тельский интерфейс (англо­язычный тоже доступен).
  • Встроенные сочетания клавиш для таких частых действий, как включение полно­экранного (F11, Alt+Enter) и псевдо­полно­экранного (Shift+Enter) режимов или снятия скрин­шота (F9, PrintScreen); закрытие программы с помощью Alt+F4 работает в полно­экранном режиме.
  • Драйверы не сбрасываются после падений, для сброса предусмотрен параметр командной строки.
  • Более удачные настройки по умолчанию: VSync, отключённое размытие, стандартные файловые диалоги Windows.
  • Повышенное удобство, исправление ошибок и проч.

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

В новом режиме «Целочис­ленное масштаби­рование» осуществляется цело­численное масштаби­рование (integer scaling) как по вертикали, так и по горизонтали, даже при включённой коррекции соотношения сторон. Благодаря этому все пикселы имеют в точности одинаковый размер, и исключается дрожание пикселов («pixel shimmering»).

Режим включён по умолчанию. Включить или выключить можно через меню «Настройки» → «Изображение» («Settings» → «Output»).

Точность пропорций и полнота использования экрана

При включённой коррекции соотношения сторон фактическое соотношение сторон может отличаться от идеального 4:3.

При обычном разрешении 256×224, используемом в подавляющем большинстве SNES-игр, наиболее высокая точность соотношения сторон и наиболее полное использование площади экрана достигаются на мониторах разрешением QHD (2560×1440), 4K (3840×2160) и 5K (5120×2880). На мониторах QHD, 4K и 5K высота экрана используется на 93%. Соотношение сторон на мониторах QHD и 5K идеальное. Погрешность на 4K-мониторах составляет менее 5% и почти незаметна на глаз.

Наименее пригодны для цело­численного масштаби­рования SNES-игр дисплеи Full HD (1920×1080): высота экрана используется лишь на 83%, а погрешность соотношения сторон составляет более 7% и заметна на глаз.

Поддерживаются стандартное и удвоенное разрешения

Цело­численное масштабирование поддерживается как для стандартных разрешений 256×224 и 256x240, так и для высоких (удвоенных) разрешений (HiRes) — таких как 512×448 и 512×224. Пример игры, использующей режим высокого разрешения — «R.P.M. Racing», где меню выводятся в разрешении 512×448.

Рекомендуется быстрый режим PPU

Рекомендуется использовать быстрый режим PPU (включён по умолчанию). В противном случае всегда используется удвоенное разрешение 512×448, из-за чего площадь экрана может исполь­зоваться менее полно, а пропорции могут соблюдаться менее точно. Режим PPU настраивается галкой «Быстрый режим» в секции «PPU (видео)» окна «Настройки» → «Улучшения» («Settings» → «Enhancements» → «PPU (video)» → «Fast mode»).

Режим «По центру» цело­численный только по вертикали

Режим «По центру» («Center»), доступный как в bsnes-mt, так и в ориги­нальном bsnes, при включённой коррекции соотношения сторон использует цело­численное масштаби­рование только по вертикали. Горизонтальный масштабный коэффициент обычно получается дробным в стремлении к точному соблюдению целевого соотношения сторон.

Но при дробных масштабных коэффициентах при отключённом размытии пикселы в строке имеют разные размеры. Из-за этого появляется эффект дрожания пикселов (pixel shimmering, ripple effect, jitter) при горизонтальном движении объектов в игре. Цело­численное масштаби­рование по обеим осям свободно от этого недостатка.

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

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

4:3 вместо 64:49

В режимах «По центру» («Center») и «Масштабирование с сохранением пропорций» («Scale») при включённой коррекции соотношения сторон, по умолчанию точно соблюдается соотношение сторон 4:3 (≈1,333). Выбрать режим и включить коррекцию соотношения сторон можно через меню «Настройки» → «Изображение» («Settings» → «Output»).

Оригинальный bsnes использует соотношение 64:49 (≈1,3), т. к. определяет ширину изображения исходя из соот­ношения сторон пиксела (PAR) 8:7 вместо целевого соотношения сторон 4:3 всего изображения. В bsnes-mt режим PAR 8:7 можно включить с помощью пункта-галки «PAR 8:7 вместо PAR 4:3» в меню «Настройки» → «Изображение».

Более точный алгоритм

Для коррекции соотношения сторон в режимах «По центру» («Center») и «Масштабирование с сохранением пропорций» («Scale») используется более точный алгоритм, округляющий ширину отмасшта­бированного изображения.

Оригинальный bsnes вычисляет скорректированную ширину ещё до вычисления отмасштабированных размеров, при этом не округляет полученное дробное значение, а отбрасывает дробную часть. Из-за этого погрешность выше, чем при округлении, и растёт пропор­ционально масштабному коэффициенту.

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

Формат PNG со сжатием

Скриншоты сохраняются в формате PNG со сжатием без потерь качества. Благодаря этому файлы скриншотов имеют многократно меньший объём по сравнению с несжатым форматом BMP, который используется в оригинальном bsnes.

Скриншот в обычном для SNES разрешении 256×224 в формате BMP имеет фиксированный объём 168 КБ. Объём скриншотов в формате PNG зависит от сложности конкретного изображения, разница в объёме по сравнению с BMP может достигать десятков и даже сотен раз. Например, PNG-скриншот экрана с логотипом игры «The Legend of Zelda» занимает всего 9 КБ — в 18 раз меньше этого же скриншота в формате BMP.

Авто­матическое создание папки скриншотов

Указанная в настройках эмулятора папка для скриншотов («Настройки» → «Пути» → «Скриншоты») («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), служащая для предот­вращения разрывов кадров (screen tearing): «Настройки» → «Драйверы» → «Видео» → «Синхронизация» («Settings» → «Drivers» → «Video» → «Synchronize»);
  • включено исполь­зование стандартных окон Windows для открытия файлов вместо нестан­дартных реализаций: «Настройки» → «Эмулятор» → «Общие» → «Использовать стандартные окна открытия файлов» («Settings» → «Emulator» → «Options» → «Use native file dialogs»). Нестан­дартные реализации работают гораздо медленнее, а также не поддер­живают переход вперёд/назад с помощью дополни­тельных боковых кнопок мыши.

Много­язычный интерфейс

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

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

  • en — английский;
  • ru — русский;
  • de — немецкий;
  • it — итальянский;
  • pt-br — бразильский португальский;
  • es — испанский;
  • ja — японский.

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

Исполь­зуемый механизм локализации позволяет легко переводить интерфейс на другие языки с помощью текстовых файлов. Если какая-то строка не переведена, вместо неё исполь­зуется исходная англо­язычная строка — благодаря этому можно переводить интерфейс частично.

Встроенные горячие клавиши

В bsnes-mt встроены сочетания клавиш (горячие клавиши) для частых действий:

  • F11, Alt+Enter для переключения в полно­экранный режим;
  • Shift+Enter для переключения в псевдо­полно­экранный режим;
  • Escape для выхода из полно­экранного или псевдо­полно­экранного режима;
  • F9, PrintScreen для снятия скриншота;
  • Ctrl+O для открытия игры;
  • Ctrl+W, Ctrl+F4 для закрытия игры;
  • F5 для сброса (reset) системы;
  • Pause/Break для приостановки эмуляции;
  • Alt+F4 для закрытия программы работает в полно­экранном режиме.

Кроме того, в меню «Настройки» → «Размер» добавлены пункты для переключения в полно­экранный и псевдо­полно­экранный режимы. Таким образом, нет необходимости вручную назначать горячие клавиши прежде, чем пере­ключиться в полно­экранный режим, а из полно­экранного режима всегда можно выйти.

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

Есть возможность включать и выключать отдельно взятые горячие клавиши с помощью окна «Настройки» → «Горячие клавиши (встроенные)» («Settings» → «Hotkeys (built-in)»).

Исправленные ошибки (баги)

  • Добавлен обход (workaround) ошибки bsnes, из-за которой окно программы в Windows 10 было невидимым, если перед запуском программы был изменён системный масштаб и система не была перезагружена.
  • Добавлен обход ошибки bsnes, из-за которой в полно­экранном режиме было невозможно закрыть программу с помощью стандартного сочетания клавиш Alt+F4.
  • Исправлена ошибка bsnes, из-за которой авто­опре­деление региона (NTSC/PAL) не работало при открытии игры с помощью стандарт­ного окна открытия файла Windows.

Прочее

  • Пункты открытия/закрытия игр и выхода из программы перенесены из меню «Система» («System») в традиционное меню «Файл» («File»).
  • Нестандартные подтверждающие окна заменены на стандартные окна MessageBox(), благодаря чему текст в них не усекается.

    bsnes:
    bsnes-mt:
  • Теперь не сбрасывается размер окна при установке и снятии галок в меню «Настройки» («Settings)»:

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

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

  • В меню «Настройки» добавлен пункт «Открыть папку настроек» («Settings» → «Open Settings Folder»). Пункт открывает папку, содержащую файл настроек программы, который может храниться в одном из трёх мест, два из которых трудно­доступны. Это позволяет легко создать резервную копию файла настроек или при необходимости (например, при аномалиях в работе программы) удалить его.
  • Пункт-галка «Aspect Correction» меню «Settings» → «Output» в англо­язычном интерфейсе пере­именован в «Aspect-Ratio Correction» (добавлено «-Ratio» после «Aspect»). «Aspect Ratio» и «Aspect» — не синонимы.
  • Добавлена индикация региональной версии игры (NTSC/PAL) в строке состояния после открытия игры.
  • В заголо­вочную панель окна настроек добавлено название раздела настроек. В ориги­нальном bsnes заголовок окна настроек — всегда «Настройки» («Settings») вне зависимости от текущего раздела настроек.
  • Фон логотипа 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. Отличается не только имя папки (директории), но и имя файла (bsnes-mt-settings.bml вместо settings.bml), поэтому исключены конфликты с bsnes даже при расположении файла настроек в папке программы. Благодаря этому bsnes и bsnes-mt могут располагаться в одной и той же папке и использовать одни и те же базы данных игр и чит-кодов и шейдеры.

Вопросы и ответы (FAQ)

На какой версии bsnes основан bsnes-mt?
bsnes-mt основан на bsnes v115 — последней официальной версии bsnes перед превращением в проект, развиваемый сообществом (community project). Важные изменения перио­дически переносятся из community-версии bsnes.
Доступен ли bsnes-mt как ядро libretro?
Нет, этот проект посвящён эмулятору как само­стоя­тельной (standalone) программе. Ядро libretro не имело бы смысла, т. к. основные специфичные для bsnes-mt функции неприменимы к libretro-версии: например, масштаби­рование и снятие скрин­шотов обычно осущест­вляются libretro-оболочкой (frontend, GUI), а не ядром. В отношении эмуляции bsnes-mt функцио­нально идентичен оригинальному bsnes.
Кросс­платфор­менный ли bsnes-mt?
Нет, bsnes-mt — только для Windows, в том числе используются специфичные для Windows реализации сжатия PNG и встроенных горячих клавиш. Автор bsnes-mt — пользователь Windows, и у него нет достаточного времени/мотивации для обеспечения кросс­платфор­менной совместимости (а приме­нительно к macOS у него даже нет такой возможности). При этом автор имеет это в виду как возможное улучшение bsnes-mt в будущем. Версия для Windows, вероятно, должна работать в Linux как есть через Wine.
Почему бы не отправить ваши изменения в офици­альные проекты higan/bsnes?

Автор bsnes-mt предпочитает развитие собственного ответвления по нескольким причинам.

  • Нет мотивации убеждать кого-либо в чём-либо. Автор рад быть независимым и делать всё, что считает правильным.
  • Нет мотивации использовать стиль написания кода, который автор обычно не использует.
  • Оригинальный bsnes кросс­платфор­менный (хотя официальные версии bsnes всегда были только для Windows), а bsnes-mt — только для Windows.
Могли бы вы добавить такую-то функцию?
Не стес­няйтесь предлагать функцио­нальность и сообщать об ошибках оригинального bsnes. Обратите внимание, что автор реализует только то, что считает достаточно полезным/важным, и только при наличии доста­точных времени, мотивации и опыта.