I have been using the Timer approach in commercial plugins, some of them have hundreds of parameters, it does scale very well.
You can also micro optimize that solution in many ways, as I’ve suggested here:
In short: you can use a static timer so there’s only one shared for all parameters and all instances of the plugin, and you can also use a (single) atomic bool shared for all parameters so that changes on the message thread don’t engage the timer and run as they should, and most of the time the timer just checks a single bool and that’s it.
