It depends on how the game is programmed. Are these settings applied at loading the full game? Or loading a level or a mission ina game? Something like the crosshairs gets loaded when the mission gets loaded but something like the resolution gets loaded when the game gets loaded. They could probably figure out a way to load all of these on demand and switch em whenever they want. However some of these things are too complicated for what it’s worth.
I am no expert so correct me if I am wrong.
Certain physical assets such as textures may be loaded from a file so we first remove the old texture and replace it with a new one.
Other things are calculated like shadows, so if we apply a more complex algorithm we can get a nicer shadow, we can calculate this on the fly without loading any assets.
It mostly depends on how the developer designed the UI to provide a certain experience to the user and also to meet some expectations on how an UI should work.
For example if you are changing the style of your character it makes sense to show the change immediately after you made your choice. On the other end if you are changing some settings that require reloading of the interface this might get annoying fast if done at each change so it makes more sense to apply all of them at once and be done with it.
Think of it like changing settings to your car. Let’s say you want to change the pressure of your tires for a rocky road ahead. You would want to stop your car and change the settings of the tires. Other settings like the speed of your windshield wipers you can change while your driving. There are just some things in software that are running so in order to change them you need to stop the program.
Edit: Thanks for the silver kind redditor!
Mostly because of the underlying workings of said settings.
Possibly interaction with other settings. Also the different setting could mean a different initialisation value, requiring a full restart.
I can give you a simple example that is easy to understand: translations. Some applications can do it on the fly, others require a restart. A common reason for this is that the language stuff is in a dedicated dll with each language on a different dll. Since dlls cannot (or may not) be unloaded it is not (or may not) possible to ditch the resources of the original language.
That mostly depends on game engine’s source code. Some are good, some are not so. Usually, resources need reloading when settings changed, and sometimes API requires recreating all objects. Usually when game requires restart to apply some options, that’s because game engine need all resources to be reloaded under new settings and it’s easier to do it just by restarting than by actual reloading.