Use adset budget optimization for anything you are testing, and use campaign budget optimization only to scale ads you have already proven. When budget sits at the campaign level, facebook decides which adset gets the money, and it will commit to one adset early and starve the rest long before you have enough data to know whether that was the right adset.
The reason this matters is that facebook is strong at one job and weak at another. It is very good at finding the right person inside a broad, open audience. It is not good at distributing budget fairly across adsets that have not had a fair chance yet. Adset budget optimization takes the weak job away from the algorithm and leaves it the job it is genuinely good at.
There is a setting that quietly undoes this. When you set an adset budget, facebook leaves a box checked that shares some of your budget with other adsets. Leaving it checked turns your adset budget back into a campaign budget in everything but name. Uncheck it.
Once ads have proven themselves, campaign budget optimization has a real use. Build a separate campaign, seed it with five to ten winning post ids, and let it run alongside the originals without turning the originals off. That structure holds far more active ads over time than a normal testing adset, and it becomes very consistent once it is seeded with things that already work.