I’ve also been doing research into this whole FixedUpdate/Update thing, and I think I may have some useful answers for you.
First, if you check out the Update Order page, you’ll notice the line stating that “FixedUpdate() is often called more frequently than Update().” Good to hear, since that might explain your FixedUpdate performance being worse, but WHY is it called more frequently? I’ll try to explain below.
You can calculate the amount of time spent per frame very easily by dividing 1 by the frame rate. For example, if your game is running at 30fps, then:
1/30fps = 0.033s, or 33ms
So, let’s say that you’ve gone into Project Settings > Time and set your fixed timestep to 0.02s, or 20ms. Your FixedUpdate functions will be called every 20ms, while your game is actually updating and processing a frame approximately every 33ms. This means:
(1 update) / (0.033s) = 30 updates per second
(1 update) / (0.02s) = 50 fixed updates per second
When your game is running at 30fps and doing fixed timesteps every 20ms, you can see that you are calling FixedUpdate nearly twice as often (50 times) as you are calling Update (30 times) per second of gameplay. In this case, FixedUpdate is being called more often, which means that your code in FixedUpdate could be called too often.
Now, let’s say you set your fixed timestep to now be 0.04s, or 40ms, which means you’ll be calling FixedUpdate approximately 25 times per second. Assuming your frame rate stays the same, you will now be calling FixedUpdate and Update roughly the same number of times.
You could abstract this and say that FixedUpdate is called more often than Update when (1/fixedTimestep) is greater than your framerate. And it is called less often than Update when the opposite is true. Whether FixedUpdate is called more often than Update is not a “set in stone” thing.
I’ve found that this answer page has a really good explanation of this, along with some graphics and an idea of what may be going on under the hood in Unity that causes this behavior. I’ll also note, based on what I’ve been reading, that you should pretty much only do physics stuff in FixedUpdate. I believe that CharacterControllers are not really physics objects, so it might not be great to update them in FixedUpdate.
I’m not an expert on this stuff by any means, so I may have gotten some of this explanation incorrect, but this is my understanding at the moment.