{"id":34,"date":"2022-08-03T05:41:46","date_gmt":"2022-08-03T05:41:46","guid":{"rendered":"https:\/\/www.cstroik.com\/?p=34"},"modified":"2023-03-27T05:32:52","modified_gmt":"2023-03-27T05:32:52","slug":"retroarch-slowstart-guide","status":"publish","type":"post","link":"https:\/\/www.cstroik.com\/index.php\/2022\/08\/03\/retroarch-slowstart-guide\/","title":{"rendered":"RetroArch Slowstart Guide"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\"><strong>Part 1: Background<\/strong><\/h3>\n\n\n\n<p>RetroArch is a frontend for the the libretro API. The idea behind libretro was to separate the higher level tasks of an emulator such as the video drivers, the configuration, input, etc. from the actual emulator itself. A libretro core will, for the most part, only handle actual emulation.<\/p>\n\n\n\n<p>Before libretro every emulator needed to handle everything on its own. This overcomplicates things because it means every single emulator would need its own implementation of everything and they were almost guaranteed to be different, it was unlikely that your NES emulator would handle input the same way as your SNES emulator. It was possible that your  GBA emulator would support a graphics API that worked well with your GPU but possible or even likely that your n64 emulator would not. Your GameCube emulator might have a great UI that is easy to use with a controller, but your PSX emulator would need a keyboard and mouse. Your SNES emulator is likely very mature and feature rich, but your Sega Genesis emulator could be barebones and lack quality of life features other emulators have.<br><br>Libretro cores have, except in special circumstances, none of these features. They are all equally dumb. Instead these features are handled by the frontend. Since all libretro cores are equally dumb, any frontend that can use one libretro core can use them all. And so, if your frontend has one feature, that means that all of your libretro cores have that feature and that that feature can be set once in the frontend and apply to every core.<\/p>\n\n\n\n<p>There are several libretro frontends but the main, most common, and most used frontend is RetroArch. RetroArch has been developed alongside libretro from nearly the beginning. For most people libretro is RetroArch and RetroArch is libretro. RetroArch is by far the most feature complete frontend. <\/p>\n\n\n\n<p>RetroArch and libretro, as a result of being developed together by mostly the same developers, both follow the same design philosophies. They are free, open source software. The vast majority of both are written in highly portable C, with the goal of having them run on all kinds of hardware and software. RetroArch and libretro cores can be built and run on Windows as well as Linux, but they can also run on x86, ARM, or even more exotic hardware. They can be built for Windows 98, Android or iOS, or even more obscure operating systems like QNX. <\/p>\n\n\n\n<p>This guide though is for a standard x86-64 install on a modern Windows machine.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Part 2: Initial Preparation<\/h3>\n\n\n\n<p>First <strong>download <\/strong>the current stable Windows build of RetroArch from <a href=\"https:\/\/www.retroarch.com\/?page=platforms\">https:\/\/www.retroarch.com\/?page=platforms<\/a><\/p>\n\n\n\n<p>On a modern Windows computer you will want the Windows Installer (64 bit)<br>Run the installer, the default install location is C:\\RetroArch-Win64, you can change this but do not put it in Program Files, Program Files (x86) or any other protected folder on Windows. Modern Windows (since Vista), limits write permissions in these folders which can cause a problem later when RetroArch needs to be able to write to its own folder.<\/p>\n\n\n\n<p>Now that RetroArch is installed we need to <strong>add bios files<\/strong> to it. Some emulators need a bios from the original console to run. These are not included with RetroArch for copyright reasons.<\/p>\n\n\n\n<p><strong>Download<\/strong> bios files here<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Retroarch-Bios-system.rar\">Retroarch Bios system<\/a><a href=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Retroarch-Bios-system.rar\" class=\"wp-block-file__button\" download><\/a><\/div>\n\n\n\n<p>Open the directory you installed RetroArch to. For the sake of this guide we will assume C:\\RetroArch<\/p>\n\n\n\n<p>Open the subfolder in C:\\RetroArch\\system and <strong>copy<\/strong> the extracted contents of the rar file we just downloaded to it<\/p>\n\n\n\n<p><strong>First&nbsp;Run<\/strong><\/p>\n\n\n\n<p>Now we&#8217;re ready to run RetroArch for the first time. <strong>run retroarch.exe<\/strong> it will load RetroArch with the default UI &#8220;ozone &#8211; black basic&#8221; which is likely what you&#8217;ll want to use on PC anyway.<\/p>\n\n\n\n<p>At this point RetroArch will generate the default configuration, this will be a file called retroarch.cfg, this file is very important and, technically, can be edited manually to change almost anything about the way RetroArch runs. You&#8217;ll know this was successful because RetroArch will notify you of it. The only way this could fail is if we installed RetroArch to a folder it does not have permission to write to.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"667\" height=\"124\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/1-Generate-retroarch.cfg_.png\" alt=\"\" class=\"wp-image-41\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/1-Generate-retroarch.cfg_.png 667w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/1-Generate-retroarch.cfg_-300x56.png 300w\" sizes=\"auto, (max-width: 667px) 100vw, 667px\" \/><figcaption>Successfully written configuration<\/figcaption><\/figure>\n\n\n\n<p>Almost every setting you change in RetroArch will write to this file. Importantly, <strong>RetroArch does NOT automatically save configuration changes to this file<\/strong>, by default we will have to manually save. This is not ideal, luckily we can change this behavior to save configuration on exit. Though it is a good habit to manually save changes, especially when you are changing many things, in case RetroArch does not shut down properly for some reason. So we will set that first in the &#8220;Settings&#8221; panel<\/p>\n\n\n\n<p>Right now we are using keyboard controls, Enter moves forward a menu and confirms changes, backspace goes back, esc twice will close the program.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"547\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/2-Settings-1-1024x547.png\" alt=\"\" class=\"wp-image-42\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/2-Settings-1-1024x547.png 1024w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/2-Settings-1-300x160.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/2-Settings-1-768x410.png 768w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/2-Settings-1.png 1876w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>RetroArch Settings Panel<\/figcaption><\/figure>\n\n\n\n<p>Navigate to <strong>Settings &gt; Configuration<\/strong> and set the following two options;<\/p>\n\n\n\n<p><strong>Configuration &gt; Save Configuration on Quit \u2013 On<br>Configuration &gt; Save Remap Files on Quit \u2013 On<\/strong><\/p>\n\n\n\n<p>Return to <strong>Main&nbsp;Menu&nbsp;&gt; Configuration&nbsp;File<\/strong> and select <strong>Save&nbsp;Current&nbsp;Configuration<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Part 3: Basic Configuration<\/h3>\n\n\n\n<p><strong> Joypad controls <\/strong><\/p>\n\n\n\n<p>Plug in your controller and go to <strong>Settings &gt; Input<\/strong><\/p>\n\n\n\n<p>For joypads RetroArch will use the X Input controller driver by default. Input type can be changed in <strong>Settings &gt; Drivers &gt; Controller<\/strong> but the only two relevant input drivers for Windows are xinput and dinput. Xinput recognizes all controllers as xbox 360 controllers. This likely does not have to be changed at all. Xinput has far better compatibility and is the newer standard. Xinput maps triggers as axis though which can matter. This is more useful to know for other emulators that handle this poorly like some standalone builds of Snes9x which have trouble with L+R mapped as axis.<\/p>\n\n\n\n<p>dinput is still used by default for keyboards though.<\/p>\n\n\n\n<p>First setup player 1&#8217;s controller in <strong>Settings &gt; Input &gt; Port 1 Controls<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"671\" height=\"536\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/3-Input.png\" alt=\"\" class=\"wp-image-43\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/3-Input.png 671w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/3-Input-300x240.png 300w\" sizes=\"auto, (max-width: 671px) 100vw, 671px\" \/><figcaption>Input Menu<\/figcaption><\/figure>\n\n\n\n<p>Hopefully the controller is automatically detected, though if you have more than one controller connected you may need to specify the device to use with the &#8220;<strong>Device Index<\/strong>&#8221; option.  Left and Right on the keyboard to find the device, then we move onto setting each key. The controller may automatically &#8220;work&#8221; with an autoconfig profile, though manually setting everything doesn&#8217;t take long and is a good habit to be sure things work the way you expect them to.<\/p>\n\n\n\n<p>It&#8217;s important to note RetroArch buttons may <strong>not<\/strong> match the button layout of your controller. With RetroArch you are configuring an abstracted, virtual controller called the &#8220;RetroPad.&#8221; This generally follows the Nintendo controller layout, not xbox. What this means is, to the RetroPad, the B button will always represent the bottom left button to the emulator core regardless of what the B button is on your controller. If you configure B to be the actual B on an xbox controller your buttons will be in the wrong place.<\/p>\n\n\n\n<p>This configuration will not be completely universal for all cores though, later we will reassign some keys with Remaps for consoles where this control scheme doesn&#8217;t work very well.<\/p>\n\n\n\n<p>Next we will set up <strong>controller hotkeys<\/strong> in <strong>Settings &gt; Input &gt; Hotkeys<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"524\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/4-Hotkeys-1-1024x524.png\" alt=\"\" class=\"wp-image-44\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/4-Hotkeys-1-1024x524.png 1024w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/4-Hotkeys-1-300x154.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/4-Hotkeys-1-768x393.png 768w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/4-Hotkeys-1.png 1782w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"495\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/5-Hotkeys-2-1024x495.png\" alt=\"\" class=\"wp-image-45\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/5-Hotkeys-2-1024x495.png 1024w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/5-Hotkeys-2-300x145.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/5-Hotkeys-2-768x371.png 768w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/5-Hotkeys-2.png 1743w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Hotkey menu<\/figcaption><\/figure>\n\n\n\n<p>We can now navigate with just the controller, from this point on we probably won&#8217;t need to use the keyboard anymore except for very specific situations, especially after we finish configuring hotkeys.<\/p>\n\n\n\n<p>For hotkeys, not all of these will need to be set. It will depend on which games you want to play and which features you need. Rarely used buttons like &#8220;Next Disc&#8221; are better set with keyboard inputs<\/p>\n\n\n\n<p>First set <strong>Menu Toggle Controller Combo  <\/strong>&#8211; When we&#8217;re in a game we&#8217;ll need to go back to the menu to do some things like save state, load state, switch games, etc. To do this we&#8217;ll use the button combination you select here<\/p>\n\n\n\n<p><strong>Hotkey enable<\/strong> \u2013 This is the button that must be pressed for hotkeys to work (so you can use hotkeys on a controller), I usually use \u201cselect.\u201d What this means is, if it&#8217;s set to select, and you set fast forward to the right trigger you will need to press select and right trigger in order to fast forward<\/p>\n\n\n\n<p><strong>Fast-Forward&nbsp;<\/strong>&#8211; There are two types of fast forward, hold and toggle. Should be pretty self explanatory, hold will fast forward as long as the button is held down, but toggle will fast forward until the button is hit a 2nd time.<\/p>\n\n\n\n<p><strong>Rewind<\/strong> &#8211; I use the left shoulder button<\/p>\n\n\n\n<p>Make a note of what <strong>Menu (Toggle)<\/strong> is set to in case the controller becomes disconnected at some point and we need to get back to the menu, the default is <strong>F1<\/strong>.<\/p>\n\n\n\n<p><strong>Settings &gt; Input &gt; Menu Controls<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"320\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/6-Menu-Controls-1024x320.png\" alt=\"\" class=\"wp-image-46\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/6-Menu-Controls-1024x320.png 1024w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/6-Menu-Controls-300x94.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/6-Menu-Controls-768x240.png 768w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/6-Menu-Controls.png 1865w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Menu Controls<\/figcaption><\/figure>\n\n\n\n<p>Here we want to set <strong>All&nbsp;Users&nbsp;Control&nbsp;Menu<\/strong>, this is so player 2 can adjust things on the menu too. Other options are usually fine as is and self explanatory. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Video&nbsp;Settings<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"505\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/7-Video-1-1024x505.png\" alt=\"\" class=\"wp-image-47\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/7-Video-1-1024x505.png 1024w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/7-Video-1-300x148.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/7-Video-1-768x378.png 768w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/7-Video-1.png 1861w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Video Settings Menu<\/figcaption><\/figure>\n\n\n\n<p><strong>Settings &gt; Video<\/strong><\/p>\n\n\n\n<p>The majority of the most important performance related settings will be here, they\u2019re also some of the hardest to understand. If you have performance problems you will spend most of your time here.<\/p>\n\n\n\n<p><strong>CRT SwitchRes<\/strong> \u2013 This tells RetroArch to take the exact video timing from a core and use that to output with native resolution 15KHz modelines for a standard or arcade CRT. This is how actual retro consoles worked and, on a real CRT from the 90s will look like a real console.<br>On a modern display this will display broken garbage, it is only useful if you have an old CRT.<\/p>\n\n\n\n<p><strong>Threaded Video<\/strong> &#8211; Runs the video driver on its own thread to avoid video driver overhead. This is useful if your video driver has terrible performance and you cannot get better performance otherwise but will make frame synchronization impossible and increases latency (which will both be discussed shortly.) It should not be enabled unless absolutely necessary, which it wont likely be.<br><\/p>\n\n\n\n<p><strong>Bilinear Filtering<\/strong> \u2013 As described, slight anti-aliasing. Very little impact but inconsequential on remotely modern hardware. Personal preference, but I set to on<\/p>\n\n\n\n<p><br><strong>Video Filter<\/strong> \u2013 Personal preference, but if you want filters, these filters run on the CPU which is not as efficient as running shaders on the GPU. Except in particular hardware configurations with a fast CPU but terrible GPU, ignore.<\/p>\n\n\n\n<p><strong>Video&nbsp;&gt; Output<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"451\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/8-Output-1-1024x451.png\" alt=\"\" class=\"wp-image-49\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/8-Output-1-1024x451.png 1024w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/8-Output-1-300x132.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/8-Output-1-768x338.png 768w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/8-Output-1.png 1855w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Output Menu<\/figcaption><\/figure>\n\n\n\n<p>Many of the settings here involve properly configuring vsync and other video settings related to synchronization. The goal here (and with most video settings) is to maintain performance but also avoid choppiness. It&#8217;s very easy to incorrectly set something and, even running at full speed, have choppy animations. Settings we will adjust next in the <strong>Synchronization<\/strong> menu are also important for maintaining smooth gameplay.<\/p>\n\n\n\n<p style=\"text-align:left\"><strong>Video<\/strong> \u2013 This is the video API you will use, not all cores support all drivers but the majority do. OpenGL and Vulkan support are by far the best supported in RetroArch, and while RetroArch does have support for DirectX there are very few situations where you would actually want to use it. The following 3 are the ones that actually matter here<\/p>\n\n\n\n<p><br><strong>gl <\/strong>\u2013 The OpenGL 2.0+ driver (will actually run OpenGL Compatibility                on modern GPUs), default because high compatibility, but not best for performance <br><strong>glcore<\/strong> \u2013 The OpenGL 3.1+ driver, still high compatibility, generally a much better option than gl<br><strong>Vulkan<\/strong> \u2013 Not all emulators have Vulkan support and will force glcore. Much better option on AMD gpus than gl due to AMDs poor track record of updating GL. Still generally a better setting on nvidia GPUs. Allows free \u201cHard GPU Sync\u201d lowering latency. <\/p>\n\n\n\n<p><br><strong>Vertical Refresh Rate<\/strong> \u2013 RetroArch will sample the display to try and figure out the refresh rate on its own, vsync must be enabled while this is running. This should be very close to the Display Reported Refresh Rate. You can manually set the Vertical Refresh Rate or let Estimated Screen Refresh Rate run long enough to stabilize, then select that option in the menu to set Vertical Refresh Rate to it.<br>This is very important for avoiding stuttery gameplay, especially with Variable Refresh Rate screens (G-Sync, Freesync, etc.) You definitely want to do this if you do not want choppy Mario.<br><\/p>\n\n\n\n<p><strong>Monitor index<\/strong> \u2013 This has nothing to do with performance, if you have multiple monitors hooked up you can choose which monitor RetroArch displays on while in fullscreen mode. Actually useful especially if you got a long HDMI cable and a TV you wanna play on. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Video &gt; Scaling<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"924\" height=\"586\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/9-Scaling.png\" alt=\"\" class=\"wp-image-50\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/9-Scaling.png 924w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/9-Scaling-300x190.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/9-Scaling-768x487.png 768w\" sizes=\"auto, (max-width: 924px) 100vw, 924px\" \/><figcaption>Scaling Menu<\/figcaption><\/figure>\n\n\n\n<p>There are few important options here, unless you want to force widescreen by stretching the image.<\/p>\n\n\n\n<p><strong>Aspect Ratio<\/strong> \u2013 Useful for forcing widescreen globally if that\u2019s how you like to play, usually best set to <strong>Core Provided<\/strong><\/p>\n\n\n\n<p><br><strong>Crop Overscan<\/strong> \u2013 If you\u2019ve ever played Mario 3 in an emulator and seen junk off to the side, this is why. Leave \u201c<strong>On<\/strong>\u201d unless you really wanna see the junk off to the side of the screen. More just an interesting thing because of how old games were designed.<\/p>\n\n\n\n<p><strong>Video &gt; Synchronization<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"936\" height=\"648\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/10-Synchronization-1.png\" alt=\"\" class=\"wp-image-51\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/10-Synchronization-1.png 936w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/10-Synchronization-1-300x208.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/10-Synchronization-1-768x532.png 768w\" sizes=\"auto, (max-width: 936px) 100vw, 936px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"821\" height=\"181\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/11-Synchronization-2.png\" alt=\"\" class=\"wp-image-52\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/11-Synchronization-2.png 821w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/11-Synchronization-2-300x66.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/11-Synchronization-2-768x169.png 768w\" sizes=\"auto, (max-width: 821px) 100vw, 821px\" \/><figcaption>Synchronization Menu<\/figcaption><\/figure>\n\n\n\n<p>A lot of these settings might be worth messing around with if things just \u201cdon\u2019t seem right.\u201d If even easy to emulate games feel choppy compared to real hardware. The most common cause of this on modern hardware is the emulator core and the display\u2019s refresh rate not matching up perfectly. Because of this, many of these recommended settings may not be completely ideal on any other machine.<\/p>\n\n\n\n<p>On displays with Variable Refresh Rate (Freesync, etc) this is usually pretty easy to work with because of one recent setting (Sync to Exact Content Framerate.)<br><\/p>\n\n\n\n<p>Many of these settings also affect latency, within the past few years RetroArch has gotten to a point where it is possible to reliably match or even sometimes beat latency on original hardware. Many of the settings though have downsides and are not usually worth it unless you really need incredibly low latency gaming (Kaizo Mario guys and stuff.)<br><\/p>\n\n\n\n<p><strong>Sync to Exact Content Framerate \u2013 On<\/strong><br> If this is set to \u201con\u201d Retroarch will double, triple, whatever is necessary the actual framerate to match the core\u2019s timing with the screen\u2019s timing as reported by VRR.<br><\/p>\n\n\n\n<p><strong>VSync \u2013 On<\/strong><br>Even with VRR this should still be set on. The only time dropping VSync is a real solution is with ancient\/low power hardware, a bad GPU, an OS with bad OpenGL support (not Windows or Linux) or serious driver bugs (this is possibly going to be an issue with Intel\u2019s new GPUs.)<\/p>\n\n\n\n<p><strong>Black Frame Insertion<\/strong> \u2013 Probably keep at <strong>0<\/strong> unless you notice blur<br>CRTs would draw a black screen in between each frame, this reduced motion blur (which is very obvious on older LCDs.) Sometimes on very high refresh rate screens you can still see motion blur when running low refresh rate content at a higher refresh rate. For example, no matter what you do N64 will always run at less than 60fps. In Mario 3, Mario will never have 120fps of movement. RetroArch can insert an empty, black frame (or multiple black frames) in between every frame to reduce this.<\/p>\n\n\n\n<p>Sometimes this is very effective, but often on good displays it\u2019s either no difference or better done by the actual display itself if it has the feature. If you notice blurry animation, it might be able to be helped by this setting, otherwise leave as is and let the actual high refresh rate do its job. <\/p>\n\n\n\n<p><strong>Adaptive VSync<\/strong> \u2013 Not necessary except on weak hardware.<br><\/p>\n\n\n\n<p><strong>Frame Delay<\/strong> \u2013 Not worth manually adjusting because the ideal number will be different depending on the core and refresh rate.<br><\/p>\n\n\n\n<p><strong>Automatic Frame Delay<\/strong> \u2013 Before a frame gets to the display, the core itself has to actually generate the frame. This is true for all graphical computing, not just emulation. Once the frame is generated user input cannot affect it since it already exists, any input in between an old frame and a generated new frame is latency which on a 60hz display generally comes out to around 17ms. Frame Delay will force the core to generate the frame at a later point, meaning there is less of a gap between user input and the frame being generated and so lower latency. If the frame is generated too late it will cause sound crackling and performance issues, the gpu does not have enough time to generate the frame before it\u2019s expected to be displayed. This isn\u2019t too much of a problem though with retro emulation on newer hardware.<br><\/p>\n\n\n\n<p>Automatic Frame Delay will aim for generating the frame at half the time the refresh rate allows for, meaning the normal 17ms will be cut in half, if it detects frame hiccups it will reduce it until the framerate becomes stable. This helps with only a minor source of latency but it also costs very little now. Usually this is best turned on, but after all other things are setup and it can be guaranteed that things otherwise run smoothly.<br><\/p>\n\n\n\n<p><strong>Hard GPU Sync<\/strong> \u2013 Set to <strong>On if using the Vulkan driver<\/strong>, it\u2019s a free reduction in latency.<br><\/p>\n\n\n\n<p><strong>Hard GPU Sync Frames<\/strong> \u2013 You want this at either <strong>0<\/strong> or 1 if 0 does end up causing issues (performance problems, unlikely if using Vulkan)<br><\/p>\n\n\n\n<p><strong>VSync Swap Interval<\/strong> \u2013 This should be set to the closest number to your <strong>screens refresh rate divided by 60 <\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Video &gt; Fullscreen Mode<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"898\" height=\"581\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/12-Fullscreen-Mode.png\" alt=\"\" class=\"wp-image-54\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/12-Fullscreen-Mode.png 898w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/12-Fullscreen-Mode-300x194.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/12-Fullscreen-Mode-768x497.png 768w\" sizes=\"auto, (max-width: 898px) 100vw, 898px\" \/><figcaption>Fullscreen Mode Menu<\/figcaption><\/figure>\n\n\n\n<p>Most of these are pretty self-explanatory, on a modern Windows machine you will want <strong>Windowed Fullscreen Mode<\/strong> set to \u201c<strong>On<\/strong>.\u201d Windows under most display drivers will run it in Windowed mode no matter what you have it set to anyway.<\/p>\n\n\n\n<p><strong>Audio<\/strong><\/p>\n\n\n\n<p><strong>Settings &gt; Audio<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"919\" height=\"646\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/13-Audio.png\" alt=\"\" class=\"wp-image-55\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/13-Audio.png 919w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/13-Audio-300x211.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/13-Audio-768x540.png 768w\" sizes=\"auto, (max-width: 919px) 100vw, 919px\" \/><figcaption>Audio Menu<\/figcaption><\/figure>\n\n\n\n<p>There\u2019s nothing to change here usually.  The Audio driver is not likely to matter on Windows, Audio Latency can matter if you have audio crackling (not common on modern hardware that can emulate at fullspeed) or to get small improvements in latency not likely to matter for most people.<\/p>\n\n\n\n<p>You can force an audio device here which can be useful if you have different sound cards that do different things but this doesn\u2019t work with many Windows audio drivers and it\u2019s usually better to have Windows do it itself instead of RetroArch<\/p>\n\n\n\n<p><strong>Latency<\/strong><\/p>\n\n\n\n<p><strong>Settings&nbsp;&gt; Latency<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"873\" height=\"639\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/14-Latency.png\" alt=\"\" class=\"wp-image-56\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/14-Latency.png 873w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/14-Latency-300x220.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/14-Latency-768x562.png 768w\" sizes=\"auto, (max-width: 873px) 100vw, 873px\" \/><figcaption>Latency Menu<\/figcaption><\/figure>\n\n\n\n<p>The settings here are mostly the settings from other sections that also affect latency. It doesn\u2019t matter whether they\u2019re set here or in the other sections.<\/p>\n\n\n\n<p>The exception is \u201c<strong>Run-Ahead to Reduce Latency<\/strong>.\u201d Run ahead is a technique designed to deal with latency inherent in the actual games themselves, is by far the most extreme way to reduce latency and is necessary to achieve latency below playing most games on their consoles natively.<\/p>\n\n\n\n<p>The configuration for run-ahead needs to be game specific, what works on one game may break another even on the same console. A very simplified explanation of how run-ahead works is, the emulator will run the game twice. One copy of the game runs ahead of the other by a certain number of frames. There are a couple ways to do this and which one is best depends on the emulator core.<\/p>\n\n\n\n<p>The main idea for both is that a state is saved after every frame, when the emulator receives an input it will load the early state to roll back to the 2nd, earlier version of the game to enter the input as if there had been no latency. <\/p>\n\n\n\n<p>For example, if you were really into Kaizo Mario hacks and you played on original hardware there would always be 2 frames of latency between when you press jump and when Mario jumps. This is built into the game\u2019s logic and can\u2019t be changed on original hardware. With run-ahead properly configured we can get to effectively 0 frames of latency even when the game otherwise would refuse it.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"464\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/runahead.png\" alt=\"\" class=\"wp-image-71\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/runahead.png 768w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/runahead-300x181.png 300w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<p>This can cause the game\u2019s logic to break though, the frames can disagree with each-other in other ways and weird things can happen. The more frames you\u2019re running ahead the more likely the two are to differ and cause the game to be unplayable. Run-ahead is an incredibly cool feature that you should probably never need to use. Especially if the game relies on randomly generated numbers for anything there is no guarantee they will remain the same between instances with run-ahead.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>AI Service<\/strong><\/p>\n\n\n\n<p><strong>Settings &gt; AI Service<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"921\" height=\"613\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/15-AI-Service.png\" alt=\"\" class=\"wp-image-57\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/15-AI-Service.png 921w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/15-AI-Service-300x200.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/15-AI-Service-768x511.png 768w\" sizes=\"auto, (max-width: 921px) 100vw, 921px\" \/><figcaption>AI Service Menu<\/figcaption><\/figure>\n\n\n\n<p>I\u2019m not gonna write a guide to this now because it gets complicated and is only useful if you want to play Japanese games that have not been translated yet, but it\u2019s a really cool feature. AI Service can overlay machine translations of text detected in games, or generate a text-to-speech translation.<\/p>\n\n\n\n<p>I\u2019ll write something about it later<\/p>\n\n\n\n<p><strong>Achievements<\/strong><\/p>\n\n\n\n<p><strong>Settings &gt; Achievements<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"904\" height=\"642\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/16-Achievements.png\" alt=\"\" class=\"wp-image-58\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/16-Achievements.png 904w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/16-Achievements-300x213.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/16-Achievements-768x545.png 768w\" sizes=\"auto, (max-width: 904px) 100vw, 904px\" \/><figcaption>Achievements Menu<\/figcaption><\/figure>\n\n\n\n<p>Retroachievements.org has added a whole bunch of user made achievements to retro games that can be tracked with an account on their website. Setup is pretty self-explanatory, but requires registering on their website. The password itself is NOT saved in RetroArch, only the login token.<\/p>\n\n\n\n<p><strong>Frame Throttle<\/strong><\/p>\n\n\n\n<p><strong>Settings &gt; Frame Throttle<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"907\" height=\"632\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/17-Frame-Throttle.png\" alt=\"\" class=\"wp-image-59\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/17-Frame-Throttle.png 907w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/17-Frame-Throttle-300x209.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/17-Frame-Throttle-768x535.png 768w\" sizes=\"auto, (max-width: 907px) 100vw, 907px\" \/><figcaption>Frame Throttle Menu<\/figcaption><\/figure>\n\n\n\n<p>The most important settings here are enabling Rewind and setting the Fast-Forward Rate.<br><strong>Frame Throttle &gt; Rewind<br>Rewind Support \u2013 On<\/strong><br>Setting this to on enables the Rewind feature, obviously. Rewind works by keeping a buffer of automatic savestates (an \u201coops\u201d file.) This does have a performance impact because this means constant writing to the drive.<\/p>\n\n\n\n<p>Every emulator handles savestates differently, they are not standardized. For most consoles savestates will be very small and the performance impact will be negligible enough to not matter. The biggest exception to this is N64 savestates. All current N64 emulator cores are variants of mupen64plus which handle savestates in roughly the same way, they are very large compared to nearly every other core. Having Rewind enabled for N64 is one of the most common causes of poor framerates in N64 games, so it\u2019s usually not a good idea to have it enabled for any N64 core.<\/p>\n\n\n\n<p>(as a side note, battery saves are different from savestates and are standardized. The emulator has to handle savestates in its own way since they are not a part of how the original consoles worked. Battery saves are handled by the game itself, they are kept separately from the rom since roms are, like the name implies, read only. Emulators just dump that data into a file, that\u2019s all a battery save is. Because of this an SNES battery save, an SRM file, will be the same whether Snes9x made it or bsnes made it.)<\/p>\n\n\n\n<p>We can enable it here if we want mostly-global rewind and create an override for N64 with Rewind disabled later to account for this<\/p>\n\n\n\n<p><strong>Rewind Frames<\/strong> \u2013 This sets how granular each \u201crewind\u201d is. The default of \u201c1\u201d is usually too slow, it will rewind at the same speed the game normally runs forward. I think <strong>5-10 frames is good for most games<\/strong>. Too high and you\u2019ll overshoot the point you\u2019re trying to rewind to.<\/p>\n\n\n\n<p><strong>Rewind Buffer Size (MB)<\/strong> \u2013 This affects how far back you\u2019ll be able to rewind. Each savestate rewind makes takes up filespace, eventually the buffer will fill and the oldest will get deleted. 20MB is a very safe, small number but you\u2019ll probably want to increase this to whatever you feel comfortable dedicating for this feature. For reference, <strong>a SNES savestate is usually about 400-600KB<\/strong>. To adjust this in different increments you need to adjust the next option \u201c<strong>Rewind Buffer Size Step<\/strong>.\u201d<\/p>\n\n\n\n<p><strong>Fast-Forward Rate<\/strong> \u2013 0.0x is usually way too fast, it will just run as fast as your computer is capable of running it when fast-forward is enabled. It\u2019s personal preference what this should be set to, but <strong>3.0x is comfortable<\/strong> for many games. Sometimes 0.0x is useful if you\u2019re grinding in RPGs I guess, but you should just grind at normal speed like a man.<\/p>\n\n\n\n<p><strong>Network<\/strong><\/p>\n\n\n\n<p><strong>Settings &gt; Network<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"857\" height=\"613\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/network.png\" alt=\"\" class=\"wp-image-60\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/network.png 857w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/network-300x215.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/network-768x549.png 768w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><figcaption>Network Menu<\/figcaption><\/figure>\n\n\n\n<p>Netplay is complicated, depends on what cores you are using and what the other player is using. It requires its own guide. RetroArch\u2019s current netcode <strong>does use rollback<\/strong> though.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Directory<\/strong><\/p>\n\n\n\n<p><strong>Settings &gt; Directory<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"882\" height=\"649\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/18-File-Browser.png\" alt=\"\" class=\"wp-image-61\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/18-File-Browser.png 882w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/18-File-Browser-300x221.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/18-File-Browser-768x565.png 768w\" sizes=\"auto, (max-width: 882px) 100vw, 882px\" \/><figcaption>Directory Menu<\/figcaption><\/figure>\n\n\n\n<p>Here we set where RetroArch looks for different kinds of files. There are only two that are likely to matter<br><\/p>\n\n\n\n<p><strong>System\/BIOS<\/strong> \u2013 Make sure this is set to C:\\Retroarch\\system (or wherever that folder is wherever you installed RetroArch)<br> <strong>This needs to match the folder we extracted BIOSes to earlier<\/strong><\/p>\n\n\n\n<p><strong>File Browser<\/strong> \u2013 Set this to the folder containing the folders that your roms are in. This isn\u2019t necessary, but will make scanning for roms later much easier.<\/p>\n\n\n\n<p><strong>Thumbnails<\/strong> can be set to another directory if you want to download Box Art or other media for all your games but keep it on another drive, like if you had RetroArch on a small, fast SSD you didn\u2019t want to fill up, but had a bigger, slow HDD you could put it all on. The same is true for Recordings and possibly Cache in exotic configurations (computers which use a ramdrive for cache. This is actually a very cool thing to do if you have a lot of ram and a lot of time, but is way outside the scope of RetroArch configuration.)<\/p>\n\n\n\n<p>If you want to download thumbnails for your game you can use the thumbnail downloader in Retroarch. This is pretty slow and sometimes inaccurate if you have a lot of games, especially full sets.<br>You can manually download them all from <a href=\"https:\/\/thumbnails.libretro.com\/packs\/\">https:\/\/thumbnails.libretro.com\/packs\/ <\/a>though much faster. Download the archives for the systems you want, extract them, and move the the directories for the console over to the thumbnails directory or whichever directory you set thumbnails for.<br><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Saving&nbsp;Configuration&nbsp;Again<\/strong><\/p>\n\n\n\n<p>Now that everything is configured it is important to make\nsure the configuration is saved, it is NOT automatically written whenever a\nchange is made, only when forced or (if we configured it to like the guide said\nto earlier) on exit.<\/p>\n\n\n\n<p><strong>Main Menu &gt; Configuration File &gt; Save Current Configuration<\/strong><\/p>\n\n\n\n<p>The main configuration file, the one we wrote here, is loaded first. There are other types of configuration files we\u2019ll use later; core overrides, directory overrides, and game overrides. They are loaded in that order, so this means the main configuration will never overwrite anything, but the other configurations will overwrite it and every override before it in the configuration hierarchy. <\/p>\n\n\n\n<p>Outside of this hierarchy there are \u201ccore options\u201d (retroarch-core-options.cfg and .opt files) which include settings specific to a core that don\u2019t need to exist in the main RetroArch configuration. Non-arcade emulators don\u2019t need an option for what to do with a coin-insert, 2d systems don\u2019t need 3d rendering options, etc.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Part 4: Adding Cores and Creating Playlists<\/h3>\n\n\n\n<p>At this point RetroArch is hopefully configured properly to at least play games at full speed, but it has no emulator cores and it\u2019s pointing to no games. We\u2019re going to install the cores first and then scan our rom folders, creating playlists for each console. Then, we should be able to easily choose a game with a controller-oriented UI and jump quickly into it with a specific emulator. First, we need the emulator cores.<\/p>\n\n\n\n<p>The emulator cores are maintained and stored on libretro servers, all of this can be done manually if the servers go down (has happened recently after dweeby hackers emptied the github),  twinaphex runs out of money and no one can pay for hosting, we all die, or if you want to build the cores yourself to either implement custom changes, optimize performance to an insane degree, diagnose problems, have too much time etc. But, the easy way is to just trust that the servers are up and download everything through RetroArch\u2019s built in updater and core downloader.<\/p>\n\n\n\n<p><strong>Adding Cores<\/strong><\/p>\n\n\n\n<p><strong>Main Menu &gt; Online Updater<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"848\" height=\"613\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/online-updater.png\" alt=\"\" class=\"wp-image-62\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/online-updater.png 848w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/online-updater-300x217.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/online-updater-768x555.png 768w\" sizes=\"auto, (max-width: 848px) 100vw, 848px\" \/><figcaption>Online Updater Menu<\/figcaption><\/figure>\n\n\n\n<p>While you\u2019re here first run the basic updates;<br><strong>Update Assets, Update Controller Profiles, Update Cheats, Update Databases, Update GLSL Shaders<\/strong><br><\/p>\n\n\n\n<p>Overlays are unnecessary for most people playing on a normal screen unless you really like the Super Gameboy art surrounding your game aesthetic. When that\u2019s all done we\u2019ll move onto the actual emulator cores.<\/p>\n\n\n\n<p><strong>Online Updater &gt; Core Downloader<\/strong><br><\/p>\n\n\n\n<p>Wait for it to fetch the corelist, and download at least one core for every system you want to emulate. I recommend cores that are easiest to work with and most compatible, not necessarily \u201cbest.\u201d The conventional wisdom is &#8220;there is no best core for a console&#8221; and, even though this sounds like a platitude, is actually true.<br>Cores, on Windows, are just dll files. They are not portable, these dll files are Windows specific executables and will not run on another operating system. Cores for Linux are built from the same source tree but end up being a different binary, and that\u2019s true with every other OS. This wont matter to you if you use RetroArch\u2019s built-in core downloader, it will always match your system, but will if you try to do it manually.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Arcade <\/strong>\u2013 Some version on FinalBurn might work, depending on your game. Honestly though, you are better off using standalone MAME if you want to emulate arcade games. MAME does not play nice as a libretro core and the MAME guys suck.<\/p>\n\n\n\n<p><strong>Atari <\/strong>(most Atari systems) \u2013 Stella<br><strong>PC Engine<\/strong> \u2013 Beetle PCE FAST<br><strong>Nintendo 3DS<\/strong> \u2013 You\u2019re better off using standalone Citra, but the libretro cores are getting there<br><strong>Nintendo DS<\/strong> \u2013 DeSmuME<br><strong>Gameboy<\/strong> \u2013 Gambatte (TGB Dual has some use for netplay)<br><strong>Gameboy Advance<\/strong> \u2013 mGBA <br><strong>Gamecube\/Wii<\/strong> \u2013 You can use the Dolphin core, but because Dolphin really has its own, very specific settings Dolphin standalone is still the best choice.<br><strong>NES <\/strong>\u2013 Nestopia UE is reliable, I generally use it. But all the NES emulators are very mature, some people really like FCEUmm, Mesen is the newcomer with some wild features to play with.<br><strong>Nintendo 64<\/strong> \u2013 install BOTH Mupen64Plus-Next and ParaLLEl. You will usually want to use Mupen64Plus-Next, and will likely get the best performance out of it. ParaLLEl  aims for more resource intensive, lower-level emulation. They are actually both the same emulator (Mupen64Plus) but with different baked in plugins. At this point Mupen64Plus-Next can be configured to use the same Low Level RDP plugin as ParaLLEl, but ParaLLEl can be configured to use a wider variety of plugins (mostly useful for compatibility.) N64 emulation, because of bad decisions made in the late 90s, is just built this way and it\u2019s too late to go back.<br><strong>SNES<\/strong> \u2013 A can of worms. Snes9x \u2013 Current is the standard, up to date version of Snes9x that works for everything, runs easily, has all the features Snes9X has gotten over the years. But then there\u2019s bsnes, byuu\/near\u2019s emulator that aims for accuracy above all else, at the expense of performance. It has its own set of features that Snes9x doesn\u2019t have (the coolest being high-res mode7, when it works) and a complicated\/hostile history with RetroArch. <br><\/p>\n\n\n\n<p>I use Snes9x, it\u2019s accurate enough for actually playing games, it has the highest compatibility with romhacks which sometimes wont work on an emulator that\u2019s too accurate, and it runs very well.<\/p>\n\n\n\n<p> The other variants of Snes9x are specifically built for lower power machines like a Raspberry Pi or a weak phone. They don\u2019t matter here.<\/p>\n\n\n\n<p><br><strong>Sega basically everything 2d<\/strong> \u2013 Genesis Plus GX <br><strong>Sony Playstation<\/strong> \u2013 SwanStation generally performs better, but Beetle PSX HW plays some games better. Both are probably about equal. PCSX ReARMed is mostly for very low end hardware.<\/p>\n\n\n\n<p>You should randomly go back into the Online Updater sometimes and select \u201c<strong>Update Installed Cores<\/strong>\u201d which will do exactly what it says and update every core that you have installed. Some cores move fast, especially the N64 emulators. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Creating Playlists<\/strong><br>Since the RetroArch UI is mostly meant to be used with a controller, browsing through directories every time you want to play a game wouldn\u2019t work very well. RetroArch can be used this way but it\u2019s really not the best or intended way to do things. Instead, RetroArch has a built in scanner that will scan the files in a directory, compare each file&#8217;s checksum to a list of all known games in RetroArch\u2019s databases stored in rdb files, and write a pointer to it in a playlist file. The databases are based around the popular fullsets for each console and should be compatible with nearly every commercial release of a game on a known system, they\u2019re updated regularly<\/p>\n\n\n\n<p>The playlists have the file extension \u201clpl\u201d but are really just simple text files. An entry in an lpl playlist looks like this;<br>      <em> &#8220;path&#8221;: &#8220;G:\\Roms\\Nintendo &#8211; Nintendo Entertainment System\\Super Mario Bros. 3 (USA).zip#Super Mario Bros. 3 (USA).nes&#8221;,<br>       &#8220;entry_slot&#8221;: 359057152,<br>       &#8220;label&#8221;: &#8220;Super Mario Bros. 3 (USA)&#8221;,<br>       &#8220;core_path&#8221;: &#8220;DETECT&#8221;,<br>       &#8220;core_name&#8221;: &#8220;DETECT&#8221;,<br>       &#8220;crc32&#8221;: &#8220;85A79D9C|crc&#8221;,<br>       &#8220;db_name&#8221;: &#8220;Nintendo &#8211; Nintendo Entertainment System.lpl&#8221;<\/em><br> If you needed to, you could manually add a game to a playlist by recreating this structure. This isn\u2019t necessary very often anymore because RetroArch has the ability to create playlists from files that don\u2019t match anything in the database but it used to be a thing people had to do.<br>This rom here exists inside a zip file, and so the playlist contains an extra bit for the path that specifies which file in the zip file to actually use. When the game is played it will be temporarily extracted, put in cache, and then deleted afterwards. Not every core supports this, but most do.<br><\/p>\n\n\n\n<p>crc32 is the checksum used to identify the rom<br><\/p>\n\n\n\n<p>core_name is not set for this rom yet (or for the playlist) but, after a cores been selected for it, that core will be written to the playlist and will become the default for it from then on.<\/p>\n\n\n\n<p>Your roms should be arranged like this. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"348\" height=\"940\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/20-Rom-Directory.png\" alt=\"\" class=\"wp-image-63\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/20-Rom-Directory.png 348w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/20-Rom-Directory-111x300.png 111w\" sizes=\"auto, (max-width: 348px) 100vw, 348px\" \/><\/figure>\n\n\n\n<p>One main folder containing a subfolder for each console. Any roms that will not have a matching database entry (prototypes, hacks, translations) should be put in another folder for that console separate from the console\u2019s main folder. I choose the naming scheme \u201cconsole (etc)\u201d for these roms. This is because we don\u2019t want the scanner picking up already scanned roms when making playlists for the translations, hacks, etc.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Scan a console by going to <strong>Import Content &gt; Scan a Directory<\/strong> and navigating to the console\u2019s directory. This is NOT for the \u201cetc\u201d folders, but only for the directory full of roms that will have a matching database entry. Once you find the directory select \u201c<strong>Scan This Directory<\/strong>\u201d<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"949\" height=\"693\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/19-Import-Content.png\" alt=\"\" class=\"wp-image-65\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/19-Import-Content.png 949w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/19-Import-Content-300x219.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/19-Import-Content-768x561.png 768w\" sizes=\"auto, (max-width: 949px) 100vw, 949px\" \/><figcaption>Import Content Menu<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"909\" height=\"141\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/21-Scan-Directory.png\" alt=\"\" class=\"wp-image-66\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/21-Scan-Directory.png 909w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/21-Scan-Directory-300x47.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/21-Scan-Directory-768x119.png 768w\" sizes=\"auto, (max-width: 909px) 100vw, 909px\" \/><figcaption>Scanning a Directory<\/figcaption><\/figure>\n\n\n\n<p>You should see the progress indicator on the bottom left of the screen. The scanner is not very fast, there are other ways to do it, but this way is accurate and compatible with all kinds of hardware. You can scan another console while one is currently being scanned but if you end up scanning more than 3 consoles at a time things will slow down by a lot. Once it\u2019s done the indicator will go away and you should have a new menu option for that console.<\/p>\n\n\n\n<p>The entry for the system will be back in the root menu on the left. Now, to finish, play a game on each scanned system. You will get an option window like this, select \u201cRun\u201d<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"923\" height=\"628\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/22-First-Run.png\" alt=\"\" class=\"wp-image-67\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/22-First-Run.png 923w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/22-First-Run-300x204.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/22-First-Run-768x523.png 768w\" sizes=\"auto, (max-width: 923px) 100vw, 923px\" \/><figcaption>Run Menu<\/figcaption><\/figure>\n\n\n\n<p><br>Now you\u2019ll be asked to select a core. Choose the core you want to use and run it. If everything went well the game should start. Press the menu hotkey you assigned (or the default F1 on your keyboard) to bring up the options menu for this core. <\/p>\n\n\n\n<p>To streamline selecting a game though, we\u2019re going to want to associate a specific core with each playlist, otherwise we\u2019ll be asked which core to use every time we go to play a game. We want to do this for every console where we\u2019re sure we only want to use one core (so don\u2019t do this with N64, we wanna manage the cores for that on a game by game basis) To do this go to;<\/p>\n\n\n\n<p><strong>Settings &gt; Playlists &gt; Manage Playlists<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"930\" height=\"665\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/23-Playlist-Management.png\" alt=\"\" class=\"wp-image-68\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/23-Playlist-Management.png 930w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/23-Playlist-Management-300x215.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/23-Playlist-Management-768x549.png 768w\" sizes=\"auto, (max-width: 930px) 100vw, 930px\" \/><figcaption>Manage Playlists Menu<\/figcaption><\/figure>\n\n\n\n<p>Select the playlist you want to assign a core to. There are a few options in this window but the important ones for us now are \u201c<strong>Default Core<\/strong>\u201d and \u201c<strong>Reset Core Associations<\/strong>\u201d (if we want to undo something we did)<br> Select \u201c<strong>Default Core<\/strong>\u201d and choose the core that matches this system<br> This sets a bit at the top of the lpl file for that playlist, for example what was<br>  <em> &#8220;default_core_path&#8221;: &#8220;&#8221;,<br>   &#8220;default_core_name&#8221;: &#8220;&#8221;,<\/em><br> Becomes<br>  <em> &#8220;default_core_path&#8221;: &#8220;C:\\Retroarch\\cores\\nestopia_libretro.dll&#8221;,<br>   &#8220;default_core_name&#8221;: &#8220;Nintendo &#8211; NES \/ Famicom (Nestopia UE)&#8221;,<\/em><br> Now if we select a game and then press \u201crun\u201d it will jump right into the game.<\/p>\n\n\n\n<p>For consoles with no default core, the core we select to run a game with will be set as the default core for that game only. So if we run Mario 64 with Mupen64Plus-Next, the next time we run Mario 64 it will use that core. If that core doesn\u2019t end up working we can change the core by selection \u201c<strong>Set Core Association<\/strong>\u201d or \u201c<strong>Reset Core Association<\/strong>\u201d and then running it again.<\/p>\n\n\n\n<p>\u201c<strong>Set Core Association<\/strong>\u201d will also work for a game in a playlist with a default core, in case there we want to, for example, run every SNES game with Snes9x-Current except Mario Kart because we want that high-res mode7 in bsnes.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Manual Scan<\/strong><\/p>\n\n\n\n<p><strong>Import Content &gt; Manual Scan<\/strong><\/p>\n\n\n\n<p>For folders with files that do not match a database we need\nto do a manual scan<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"862\" height=\"619\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/24-Manual-Scan.png\" alt=\"\" class=\"wp-image-70\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/24-Manual-Scan.png 862w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/24-Manual-Scan-300x215.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/24-Manual-Scan-768x551.png 768w\" sizes=\"auto, (max-width: 862px) 100vw, 862px\" \/><\/figure>\n\n\n\n<p>Point \u201c<strong>Content Directory<\/strong>\u201d to the folder with the roms we want to scan<br><\/p>\n\n\n\n<p>If we set <strong>System Name<\/strong>, the scanner will merge these roms in with the other playlists we have for this console. I don\u2019t usually do this, I think it\u2019s best to keep database roms and non-database roms separated. To do that, set System Name to \u201c<strong>Custom<\/strong>\u201d<\/p>\n\n\n\n<p><strong>Custom System Name<\/strong> can be anything, whatever we want it to be called. It will not affect which cores we can use.<\/p>\n\n\n\n<p><br>If we leave the Default Core blank we\u2019ll have to associate a core with the games later. We\u2019ll also have to explicitly tell RetroArch which files to scan for. It\u2019s much easier to just set a core that matches the type of roms we\u2019re scanning and let it do the rest, even if we want to change core associations later.<br><\/p>\n\n\n\n<p>Once that\u2019s done scroll to the bottom and select \u201c<strong>Start Scan<\/strong>.\u201d That\u2019s it, you should now have another playlist that functions like every other playlist.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Part 5: Core Configuration<\/h3>\n\n\n\n<p>This section will not be complete. Every single core has some of its own specific settings and behavior that is handled in the core because there are some things that are very specific to an N64 emulator that are completely irrelevant to an NES emulator. Most emulators will run fine without any extra configuration, though, and the emulator specific configurations are mostly extra things like high res texture packs, CPU overclock or overclocking specific chips that only that system uses (like SuperFX chip overclocking on SNES, which actually makes StarFox play better emulated than on original hardware.)<\/p>\n\n\n\n<p>N64 emulation is an exception and each N64 core has many core specific options that might be necessary to get certain games working. This is one of the reasons it\u2019s usually better to play the Virtual Console version in Dolphin if that exists.<\/p>\n\n\n\n<p>PSX emulation can get a little complicated too.<\/p>\n\n\n\n<p>But for all that, I think it\u2019s better to write separate core specific guides, which I might end up doing but I won\u2019t do now because all in all it would be 10 times longer than this guide just for that. Instead, we\u2019ll cover the few core specific options that apply to all cores and that we\u2019re going to want to do anyway.<\/p>\n\n\n\n<p><strong>Accessing Core Specific Options<\/strong><br><\/p>\n\n\n\n<p>Start a game with the core you want to set options for. Press the menu button. You are now at the screen for all game and core specific options. This is also where you save and load states or restart the game without a hotkey.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"832\" height=\"601\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/25-Core-Options-1.png\" alt=\"\" class=\"wp-image-72\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/25-Core-Options-1.png 832w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/25-Core-Options-1-300x217.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/25-Core-Options-1-768x555.png 768w\" sizes=\"auto, (max-width: 832px) 100vw, 832px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"598\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/26-Core-Options-2.png\" alt=\"\" class=\"wp-image-73\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/26-Core-Options-2.png 840w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/26-Core-Options-2-300x214.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/26-Core-Options-2-768x547.png 768w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"829\" height=\"607\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/27-Core-Options-3.png\" alt=\"\" class=\"wp-image-74\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/27-Core-Options-3.png 829w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/27-Core-Options-3-300x220.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/27-Core-Options-3-768x562.png 768w\" sizes=\"auto, (max-width: 829px) 100vw, 829px\" \/><figcaption>Core Options Menu<\/figcaption><\/figure>\n\n\n\n<p><strong>Control Remaps<\/strong><\/p>\n\n\n\n<p><strong>Core Options Menu &gt; Controls<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"843\" height=\"601\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/28-Remap.png\" alt=\"\" class=\"wp-image-75\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/28-Remap.png 843w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/28-Remap-300x214.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/28-Remap-768x548.png 768w\" sizes=\"auto, (max-width: 843px) 100vw, 843px\" \/><figcaption>Controls Menu<\/figcaption><\/figure>\n\n\n\n<p>We originally set up our controller as if it was an SNES controller. This control scheme sucks though for some consoles, especially NES and GB with their 2 button setups. B and A are going to be the bottom two buttons on the controller, with A being to the right and slightly above B on most controllers. Remember though, that RetroArch uses the Nintendo layout, if you\u2019re using an xbox controller your \u201cB\u201d will be RetroArch\u2019s \u201cA.\u201d<br><\/p>\n\n\n\n<p>With this control scheme, imagine you\u2019re playing Mario. You\u2019ve got B held down to run because you\u2019ve been playing this game for 30 years and you never need to not be running. You gotta jump, so you have to contort your thumb over to the right to hit A every time. This was easier to do on an actual NES controller where the buttons were close and directly horizontal to each other but is awful on a modern controller.<br><\/p>\n\n\n\n<p>What works really well though is to set Y to be B, and then B to be A. That way the top of your thumb is B, the bottom is A. To do a running jump you just gotta rock your thumb down a little bit. But if we set RetroArch to that control scheme then SNES games will all be weird.<\/p>\n\n\n\n<p>Easy solution though, <strong>controller remaps per core<\/strong>. <strong>Load up an NES game<\/strong>, back out into the menu and scroll down until you find \u201c<strong>Controls<\/strong>.\u201d<br><\/p>\n\n\n\n<p>Go down to \u201c<strong>Port 1 Controls<\/strong>\u201d to setup player 1 (we\u2019ll have to repeat this for player 2 if we want) and you\u2019ll get a list of every single button on the controller.<br><\/p>\n\n\n\n<p>We are not assigning buttons to functions here for the most part. We\u2019re assigning buttons to other buttons. So, for the NES controller example, go find \u201c<strong>B Button (Down)\u201d and set that to \u201cA.\u201d<\/strong> Do the same thing for Y, and maybe set the other 2 face buttons to turbo buttons for NES or any other changes you want.<br><\/p>\n\n\n\n<p>Go back one screen when you\u2019re done and select \u201c<strong>Manage Remap Files<\/strong>\u201d<br><\/p>\n\n\n\n<p>If we select \u201c<strong>Save Core Remap File<\/strong>\u201d it will make what we just did the default control scheme for every game that uses this core. If we select \u201c<strong>Save Game Remap File<\/strong>\u201d then, just this game. \u201c<strong>Save Content Directory Remap File<\/strong>\u201d is the less used option and will set it to just this directory, useful if we organize RPGs into one directory or something and set a one handed control scheme for just those games but want to play all other games with a different control scheme or if we&#8217;re using an emulator that emulates multiple consoles with different button layouts (common for Sega emulators.)<br><\/p>\n\n\n\n<p>Do the same for GB, GameGear, Master System, Atari, whatever console you want to configure and that\u2019s done.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Shaders<\/strong><\/p>\n\n\n\n<p><strong>Core Options Menu &gt; Shaders<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"867\" height=\"614\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/29-Shaders1.png\" alt=\"\" class=\"wp-image-76\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/29-Shaders1.png 867w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/29-Shaders1-300x212.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/29-Shaders1-768x544.png 768w\" sizes=\"auto, (max-width: 867px) 100vw, 867px\" \/><figcaption>Shaders Menu with Video Shaders set to &#8220;On&#8221;<\/figcaption><\/figure>\n\n\n\n<p>A shader is essentially a list of functions that affect the way the GPU draws something on a screen, in emulation these shaders are applied as a filter over the original image to various effect. It\u2019s very hard to write this explanation without sounding vague and that\u2019s because what shaders do for a game, practically, has grown a lot over the past 20 years.<\/p>\n\n\n\n<p><br>Long ago, even in early emulators like ZSNES, shaders like Eagle and 2xSaI were around. The shaders would interpolate an upscaled image from the game as a kind of anti-aliasing. So, blocky NES or SNES games would look smooth. But they\u2019d also look very different, and sometimes just a little wrong.<\/p>\n\n\n\n<p>These shaders still exist, and the main idea behind them (making a low-resolution image look smooth or some kind of \u201cbetter\u201d at a higher resolution) is still probably the most popular reason for using shaders. It\u2019s also the most controversial reason for using them.<br><\/p>\n\n\n\n<p>Other shaders attempt to accommodate for the differences in modern screens and whatever screen the original hardware was played on back in the day. Often this means emulating scanlines that you\u2019d get on an old CRT (the black lines in between the actual image lines) or the pixel layout of a CRT. There are also shaders that, for example, cover the screen in that faded green so it looks like an original Gameboy.<br><\/p>\n\n\n\n<p>Then some shaders do more general effects like mirroring the entire image so you can play some backwards Mario, or make the image look like it\u2019s a VHS recording, etc.<\/p>\n\n\n\n<p>Some people hate shaders because they feel like they change the game too much, ruining the intended art style. That retro games were made with the limitations of the hardware in mind. But then other people argue that these games don\u2019t look how they were intended anyway, most of these consoles existed when CRTs were the main or only kind of display. A modern LCD will never look like a CRT, CRTs blurred the image, generated colors differently, had scanlines, etc. And some people just like smooth Mario. It\u2019s personal preference, but the one thing that objectively might matter is that using a shader does have a performance hit which can matter when emulating more modern consoles at higher than original resolution.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"865\" height=\"666\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Mario-NoShaders.png\" alt=\"\" class=\"wp-image-79\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Mario-NoShaders.png 865w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Mario-NoShaders-300x231.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Mario-NoShaders-768x591.png 768w\" sizes=\"auto, (max-width: 865px) 100vw, 865px\" \/><figcaption>Mario with <strong>No&nbsp;Shaders<\/strong><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"871\" height=\"667\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-GB.png\" alt=\"\" class=\"wp-image-80\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-GB.png 871w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-GB-300x230.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-GB-768x588.png 768w\" sizes=\"auto, (max-width: 871px) 100vw, 871px\" \/><figcaption>Mario with an <strong>original&nbsp;Game&nbsp;Boy&nbsp;Shader<\/strong><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"867\" height=\"661\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-CRT-Royale.png\" alt=\"\" class=\"wp-image-81\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-CRT-Royale.png 867w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-CRT-Royale-300x229.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-CRT-Royale-768x586.png 768w\" sizes=\"auto, (max-width: 867px) 100vw, 867px\" \/><figcaption>Mario with the common CRT scanline shader <strong>CRT &#8211; Royale<\/strong><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"868\" height=\"665\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-xbr.png\" alt=\"\" class=\"wp-image-82\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-xbr.png 868w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-xbr-300x230.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/Shader-xbr-768x588.png 768w\" sizes=\"auto, (max-width: 868px) 100vw, 868px\" \/><figcaption>Mario with the scaling and smoothing shader <strong>xBR<\/strong><\/figcaption><\/figure>\n\n\n\n<p>There are 3 shader formats RetroArch has support for;<br> <strong>CG <\/strong>\u2013 \u201cC for Graphics\u201d Deprecated, RetroArch can still be built to support this format but your copy likely won\u2019t be. There\u2019s no reason to use this anymore.<br> <strong>GLSL <\/strong>\u2013 OpenGL Shading Language, this is the shader format that supports older OpenGL. If you are using any of the OpenGL video drivers this shader format will work.<br> <strong>Slang <\/strong>\u2013 The newest format which, if you can use it, you should use it. This works with OpenGL Core (but not older OpenGL), the Direct3D video plugins, and most importantly this is the shader format that works with Vulkan.<\/p>\n\n\n\n<p>To use shaders, start the game you want to apply a shader to. Return to the menu while the game is running.<br> <strong>Main Menu &gt; Quick Menu &gt; Shaders<\/strong> (it\u2019s near the bottom)<br> Set \u201c<strong>Video Shaders<\/strong>\u201d to \u201c<strong>On<\/strong>\u201d<br> Select a shader preset by pressing \u201c<strong>Load<\/strong>\u201d then select the folder for the shader type you want to use. If you choose a type that the video driver you\u2019re using does not support all the folders will be empty.<\/p>\n\n\n\n<p>Choose your preset, go back to the Shader menu, press \u201c<strong>Apply Changes<\/strong>\u201d<br><\/p>\n\n\n\n<p>You can fine tune the shader options (how many passes, what kind of filter you want to apply) with the options at the bottom, but there should be a preset that does what you want without having to mess with this too much.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"862\" height=\"616\" src=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/30-Shaders2.png\" alt=\"\" class=\"wp-image-77\" srcset=\"https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/30-Shaders2.png 862w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/30-Shaders2-300x214.png 300w, https:\/\/www.cstroik.com\/wp-content\/uploads\/2022\/08\/30-Shaders2-768x549.png 768w\" sizes=\"auto, (max-width: 862px) 100vw, 862px\" \/><figcaption>Shader Menu with Shader Preset loaded<\/figcaption><\/figure>\n\n\n\n<p>If you find a shader you like that you want to make default for that game, or every game that uses that core, or even every game in every core (you probably don\u2019t want to do that last one. Shaders that look good on SNES don\u2019t usually look good on n64) from the <strong>shader menu<\/strong> press;<br> <strong>Save &gt; Save Core Preset<\/strong> (or <strong>Game Preset<\/strong>, or <strong>Global Preset<\/strong>)<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Core Options<\/strong><\/p>\n\n\n\n<p>From the Quick Menu (the same place we were to apply shaders and control remaps) there is an option called \u201c<strong>Options<\/strong>\u201d<\/p>\n\n\n\n<p>This contains all <strong>core specific options<\/strong> for the <strong>current running core<\/strong>. It will be different for every core, it\u2019s a good idea to look around here though, especially for 3d systems. For example, with PSX and N64 emulators this is where you\u2019ll find the options to adjust the internal resolution the game runs at, most of these games look like garbage at their original resolution and can be easily run at higher resolutions.<\/p>\n\n\n\n<p>Whatever core though, you can choose to set options for a specific directory or game by going to <strong>Options &gt; Manage Core Options &gt; Save Game Options<\/strong> or <strong>Save Content Directory Options<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><br><strong>Conclusion<\/strong><br><\/p>\n\n\n\n<p>At this point, assuming I didn\u2019t forget anything (which I probably did) almost everything should be playable and RetroArch should be configured well enough. There\u2019s still more; netplay, the AI Service, Core specific options, but the important stuff is done.<br><\/p>\n\n\n\n<p>What this means is that you can start RetroArch with a controller in hand, you\u2019ll have all of your roms right there. All games will be configured in the same way. Nothing will require using a mouse, and if your hotkeys are set up properly you won\u2019t need a keyboard either. You can jump from game to game easily even on different consoles without having to take your hands off your controller.<br><\/p>\n\n\n\n<p>If you wanted to you could fine-tune the way you emulate games to an insane degree, you can do this with all emulators at once or individually. All of your emulators should have mostly the same features and the same UI.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Part 1: Background RetroArch is a frontend for the the libretro API. The idea behind libretro was to separate the higher level tasks of an emulator such as the video drivers, the configuration, input, etc. from the actual emulator itself. A libretro core will, for the most part, only handle actual emulation. Before libretro every &#8230; <a class=\"read-more\" href=\"https:\/\/www.cstroik.com\/index.php\/2022\/08\/03\/retroarch-slowstart-guide\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,3],"tags":[6,7,4,5],"class_list":["post-34","post","type-post","status-publish","format-standard","hentry","category-emulation","category-tech","tag-emulation","tag-guides","tag-retroarch","tag-tech"],"_links":{"self":[{"href":"https:\/\/www.cstroik.com\/index.php\/wp-json\/wp\/v2\/posts\/34","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cstroik.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cstroik.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cstroik.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cstroik.com\/index.php\/wp-json\/wp\/v2\/comments?post=34"}],"version-history":[{"count":16,"href":"https:\/\/www.cstroik.com\/index.php\/wp-json\/wp\/v2\/posts\/34\/revisions"}],"predecessor-version":[{"id":167,"href":"https:\/\/www.cstroik.com\/index.php\/wp-json\/wp\/v2\/posts\/34\/revisions\/167"}],"wp:attachment":[{"href":"https:\/\/www.cstroik.com\/index.php\/wp-json\/wp\/v2\/media?parent=34"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cstroik.com\/index.php\/wp-json\/wp\/v2\/categories?post=34"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cstroik.com\/index.php\/wp-json\/wp\/v2\/tags?post=34"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}