RetroArch 1.9.3 released!


RetroArch 1.9.3 has just been released.

Grab it here.

Remember that this project exists for the benefit of our users, and that we wouldn’t keep doing this were it not for spreading the love with our users. This project exists because of your support and belief in us to keep going doing great things. If you’d like to show your support, consider donating to us. Check here in order to learn more. In addition to being able to support us on Patreon, there is now also the option to sponsor us on Github Sponsors! You can also help us out by buying some of our merch on our Teespring store!

Release notes

We have a roadmap now (see here), and you can expect more frequent releases from this point on. We are aiming for a new version every two weeks. We were initially aiming to have the Lakka version ready to be released concurrently with this version, but had to postpone it. We are definitely aiming to have a new Lakka version ready with future releases of RetroArch though.

We have implemented core info file caching and enabled this by default for the console platforms. This should lead to significantly reduced startup times and content loading after the first initial startup. The first time RetroArch starts up (and/or new core info files are added), it will need to build/rebuild the cache. After that though, it only has one cached file it has to load at startup instead of having to sequentially read every single core info file. This used to take a very long time on platforms with slow disk I/O (such as game consoles). PSP/Vita and 3DS users in particular will definitely notice these improvements.

WiiU users get a couple of new cores, such as bk (the Oberon RISC emu), xRick (the Rick Dangerous game engine reimplementation), and REminiscence (the Flashback game engine reimplementation).

Highlights

Core info file caching

It seems that on platforms with slow disk I/O (mostly all game consoles), it takes the same amount of time to load a file no matter how large it is (within reason) – so ~300 ms to load one info file, and the same ~300 ms to load everything stored in one cache file. Loading ~80 info files takes forever – and basically constitutes almost all the startup time on these systems. This reality is what has led to a new feature called ‘core info file cache’. An anecdotal report from the person who implemented this – previously without core info file caching t took 29 seconds just to boot XMB. With the core info file cache, it only takes 12 seconds. On RGUI, it boots in 3 seconds or less. Significant reductions to be sure.

Things you should know about the core info file caching

  • Core info cache can now be enabled/disabled on all platforms via a new Settings > Core > Cache Core Info Files option
  • Core info cache file are stored as core_info.cache
  • The core info cache file is compressed (rzip) to further reduce disk I/O
  • The presence of a core_info.refresh file in the core info directory will force a one-time refresh of the info cache. This file is generated automatically when toggling on the Cache Core Info Files option, and we will also add it to core info file packaging such that updating info files (either manually or via the online updater) will force a refresh
  • The core info cache no longer contains ‘core is locked’ and ‘firmware missing’ data fields; these are ‘dynamic’ properties that must be determined at runtime
  • The ‘core is locked’ status is now determined on core info initialisation by parsing the core directory listing, rather than by performing individual ‘lock file exists’ checks. This minimises file I/O, and greatly improves performance on devices with slow storage
  • While parsing the core info cache file, we now avoid unnecessary strdup()s when adding entries to the resultant cache list

(Static Platforms) Add option to not restart RetroArch when launching content with the currently loaded core

Before, whenever content was loaded using a static build of RetroArch (i.e. most of the console ports), a new process is forked. This basically means that RetroArch in it’s entirety is reloaded, which can be quite slow.

This kind of ‘reload’ is required when changing cores (since each is a stand-alone application) – but if the core we want to launch is already loaded, then it’s wasted effort.

1.9.3 adds a new Always Reload Core on Run Content option under Settings > Cores on statically built platforms. When enabled (by default on consoles), the current existing behaviour is maintained. When disabled, launching content with a core that is already loaded will skip the process fork/reinitialisation and just load the content directly.

On an o3DS testing setup, this reduces content load times by 60%-70%, depending upon the core.

Important caveats:

  • There is a significant annoyance in the way that static builds work. If you run the ‘top level’ RetroArch app, then everything works as you would expect – but if you run a core directly (e.g. a specific core cia on 3DS), RetroArch doesn’t actually have any way of knowing which core is currently loaded. It ‘assumes’ you are running the last loaded core – which may not be the case. If it isn’t, the first ‘run content’ operation with Always Reload Core on Run Content disabled will cause an unnecessary fork (but the next ‘run content’ will behave correctly). Unfortunately there is nothing we can do about this…

Changelog

1.9.3

  • 3DS: Disable menu screensaver animations in XMB/GLUI
  • COMMAND: Initialize netcmd->cmd_source_len before recvfrom()
  • CONTENT LOADING/STATICALLY LINKED: Ensure ‘Always Reload Core on Run Content’ setting is applied when loading content via the file browser
  • CONTENT LOADING/EMSCRIPTEN: Fix content loading via file browser on platforms with ‘broken’ core handling (i.e. emscripten)
  • CORE INFO: Skip whitespace when writing compressed core info cache files
  • CORE INFO/FILE IO: Core Info cache; significant file I/O performance improvements on systems with slow disk file I/O
  • CORE INFO/FILE IO: Enable core info cache by default on all ‘console’ platforms
  • FREEBSD: FreeBSD build fix
  • LAKKA: Support for tweaking CPU governors/scaling policies
  • LAKKA: This adds managed policies and settings to store them and reload them at startup
  • LIBRETRO API: Add API extension for cores to override frontend fast-forward state
  • MENU/RGUI: Fix saving of config files/overrides when ‘Lock Menu Aspect Ratio’ is enabled
  • SHADERS: Fix ‘Auto-Shader Delay’ functionality
  • UWP/D3D11: Disable mipmap generation
  • UWP/XBOX: Add ‘Force 4K resolution’ option (Force the resolution to the fullscreen size on Xbox, if set to 0, a fixed value of 3840 x 2160 will be used)

RetroArch 1.9.2 released!


RetroArch 1.9.2 has just been released.

Grab it here.

Remember that this project exists for the benefit of our users, and that we wouldn’t keep doing this were it not for spreading the love with our users. This project exists because of your support and belief in us to keep going doing great things. If you’d like to show your support, consider donating to us. Check here in order to learn more. In addition to being able to support us on Patreon, there is now also the option to sponsor us on Github Sponsors! You can also help us out by buying some of our merch on our Teespring store!

Release notes

PlayStation Vita users will be happy to learn that the issues with gpSP (Game Boy Advance emulator) are now resolved, and it should work as reliably as it did before 1.9.1 (and perhaps even better now thanks to increased performance). We hope you get a lot of mileage out of this core as a lot of work and effort went into it to really optimize the performance of this core over the past few months!

Text To Speech support is now enabled for the macOS Universal build. You can access this by going to Settings -> Accessibility and enabling ‘Accessibility Enable’.

Some nice changes under the hood that are more technical in nature: config file loading performance has been improved immeasurably which should help out with initial startup times of RetroArch, loading config files as well as loading shader presets. Core info file loading itself has also seen many performance improvements. We are aware that despite all this, loading all the assets in the more feature-rich menus like MaterialUI/XMB/Ozone can still take a long time on systems encumbered by slow disk I/O, but we have some special things in store for future versions that should increase asset loading performance significantly.

There is now multi soft-patching file support. We will explain this in more detail below.

Highlights

Multi soft-patching support

If an IPS/BPS/UPS patch is found, will replace the last character in the filename with a counter and loop until another patch is found (in any format).

Example matching filenames:

Contra (Japan).nes
Contra (Japan).ips # Applied first
Contra (Japan).ips1 # Applied second
Contra (Japan).ups2 # Applied third

Notice that if one filename breaks the loop, the following patches won’t be applied too. e.g.:

Contra (Japan).nes
Contra (Japan).ips # applied
Contra (Japan) (Translation).ips1 # Partial name match, not applied
Contra (Japan).ups3 # Not applied either

Enhanced ‘Load Content’ file browser search functionality

1.9.2 adds the same search filter functionality that currently exists for playlists to the file browser when selecting Load Content. This means:

  • When navigating the filesystem via the file browser, the user can press RetroPad X (or /, etc.), and enter a search term
  • This becomes a filter – all matching entries will be displayed
  • The user can then perform another search to further refine the results. Up to 8 filters may be stacked in this fashion
  • Pressing ‘cancel’ clears the last entered filter

For example:

In order to support file browser navigation, the search filter implementation had to be rewritten. Instead of having a single menu-driver-level search filter, independent search terms are now stored for each menu list. This is a far more robust solution, and means that filters can be enabled for other menus far more easily (and without any hacks). To demonstrate this, 1.9.2 also enables search filters when selecting shader presets/passes via the file browser (I will try to add this in more places as time permits):

Finally, 1.9.2 makes the following changes to existing search functionality:

  • Entering a search term consisting of a single Latin alphabet character will now always jump to the first entry whose first character matches – i.e. we no longer apply search filters in this case, since a single alphabet character filter is not useful. This means single character searches can be used for fast alphabet navigation
  • When searching file browser lists, the ‘utility’ entries (e.g. Parent Directory) are ignored, since they have no bearing on the actual list content (i.e. searching for p will now jump to the first p file – previously, it would always jump to Parent Directory…)
  • When performing non-filter searches, the entry labels used in each comparison now exactly match what is printed on screen by the menu driver. Previously, raw file_list values were used, which are often the same, but not always (e.g. in a number of cases, this is the difference between searching against full file paths vs. path basenames, which can produce erroneous results)

In addition to all this, 1.9.2 also enables search filter support when using the file browser to select cheats and overlays.

Optional menu screensaver animations

At present, when using XMB/GLUI/Ozone, enabling the menu screensaver will cause the screen to be blanked when the screensaver timeout has elapsed. 1.9.2 adds three optional animations that may be displayed instead – these can be selected via the new Settings > User Interface > Menu Screensaver Animation entry; animation speed may be adjusted via Settings > User Interface > Menu Screensaver Animation Speed. The options are as follows:

OFF: Screen will be blanked

Snow:

Starfield:

Vortex:

These effects are rendered using font glyphs; the performance overheads of all the animations are therefore low. This should also give you some indication as to how we are planning to reduce file I/O overhead across the board when it comes to asset loading, but that is something that we will be unveiling for a future release!

When using GLUI/Ozone, the screensaver will be tinted (somewhat) according to the current menu colour theme (XMB uses a fixed screensaver colour, since it does not have a ‘proper’ colour theme implementation).

OpenDingux beta: Add 50Hz support

All devices running OpenDingux Beta have native support for both 60 Hz and 50 Hz display modes. 1.9.2 enables 50 Hz functionality in RetroArch. The refresh rate can be toggled between 60 Hz and 50 Hz via the Settings > Video > Output > Vertical Refresh Rate menu entry; the value can be saved on a per-core/content directory/game basis via regular config overrides.

This makes OpenDingux devices (running the Beta OS) pretty much the only affordable/easily available handhelds that can run both NTSC and PAL content smoothly. The VICE core in particular benefits enormously from this addition.

OpenDingux beta: Fix IPU scaling when running GB/GBC/GG/NGP-resolution content

Further testing of the OpenDingux Beta port has revealed several more resolutions which are mishandled by the IPU hardware scaler. 1.9.2 updates the resolution blacklists accordingly, fixing scaling for the following content:

  • Gameboy (+ Color)/Game Gear at native, x2 and x3 resolutions
  • Neo Geo Pocket (+ Color) at x2 resolution

Changelog

1.9.2

  • 3DS: Enable graphics widgets / overlays
  • 3DS: Load texture images as BGR colors
  • 3DS: Change default asset directory
  • CHEEVOS: Allow rcheevos_patch_address to be called on game without achievements
  • CHEEVOS: Update achievement memory maps (add Supervision)
  • CONFIG/FILE: Use hash map to optimise key/value lookups
  • CORE INFO: Performance optimisations + code clean-ups/refactors
  • CRT/SWITCHRES: Fixed CRTSwitchRes framebuffer bug
  • DISCORD/RPC: Fix regression
  • DRM: set the correct video mode
  • FASTFORWARD: Enforce minimum fastforward_ratio of 1.0
  • FONTS/FREETYPE/STB_UNICODE/BITMAPFONT: Prevent texture bleed when rendering text at non-integer scales
  • INPUT: Ensure that ‘retro_set_controller_port_device’ is called when updating ‘Max Users’
  • INPUT/XEGL/MOUSE: Fix xegl_ctx.c mouse activation
  • INPUT/SDL: Fix crash in SDL input driver when analogs are bound
  • INPUT/POINTER: Add scaling to pointer input
  • INPUT REMAPPING: Fix regression on loading file
  • INPUT REMAPPING: Fix regression where disabling input remapping would disable input
  • IOS: Disable system button gestures on iOS 14
  • IOS: Prevent potential crash on controller connect – randomly would get a crash when connecting a game controller while RA was running
  • LAKKA: Add menu for time zone setting
  • LOGGING: RARCH_LOG_V checking for verbosity level is not necessary and can cause issues; removed said check.
  • LOGGING: Silence inappropriate cheatfile logging
  • IOS/MAC: Add CPU VFP unit detection for Darwin
  • MAC: Swallow ‘escape’ key being pressed – would previously make the game toggle between fullscreen and windowed
  • MAC: Intel and ARM64 timer change proposal.
  • MAC/ARM64: run_fast_mode disabled for 64 bits invalid instructions.
  • MAC/OPENGL: Fix codesigning issue
  • MAC/UNIVERSAL: Add TTS translation service support.
  • MENU: Add optional menu screensaver
  • MENU: Add search filter support to cheats and overlays file browser menus
  • MENU/FILEBROWSER: Enhanced ‘Load Content’ file browser search functionality
  • MENU/INPUT: Block accidental diagonals in menu navigation
  • MENU/RGUI: Add option to disable menu transparency
  • MENU/RGUI: Fix display of ‘Video > Scaling’ menu when ‘Lock Menu Aspect Ratio’ is enabled
  • MENU/MATERIALUI: Add icon to ‘Turbo Fire’ menu entry
  • MENU/OZONE: Ozone Dracula theme
  • OPENDINGUX/BETA: Fix IPU scaling when running GBA-resolution content
  • OPENDINGUX/BETA: Add 50Hz support
  • OPENDINGUX: Enable ‘SaveRAM Autosave Interval’ by default
  • PATCHES: Added multi-softpatching support + OSD messages for patches
  • RHMAP: Track the complete string in rhmap
  • VITA: Align VM block size to 1MB – should fix one of the issues with gpSP
  • WINDOWS/GDI: Fix non-ASCII text rendering
  • XEGL: Fix mouse not working when using OpenGLES with X11