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. Обратите внимание, что автор реализует только то, что считает достаточно полезным/
важным, и только при наличии достаточных времени, мотивации и опыта.