Calling Space.Update() without a parameter steps forward by exactly one time step, while Space.Update(dt) takes as many time steps of length Space.TimeStepSettings.TimeStepDuration to simulate the accumulated time. When using the Space.Update(dt) version, the engine can take a varying number of time steps per Space.Update(dt) call. Sometimes it could be 0, other times it could be 2. (Under bad conditions, it could go up to 3, but beyond that the Space.TimeStepSettings.MaximumTimeStepsPerFrame limit- which defaults to 3- will kick in.)
Since a different amount of time can be simulated in each frame, things can appear to jitter around a bit.
Here are some potential fixes:
1) Use interpolated states. The time remainder at the end of each frame is used to blend between the last two computed states. More information can be found in section 2.B of the
Updating Asynchronously documentation. (Interpolated states are not directly related to asynchronous updating, but it is a common use case.)
To use interpolated states, set Space.BufferedStates.Enabled to true, and then use the Space.BufferedStates.InterpolatedStates.GetState or GetStates, or the entity.BufferedStates.InterpolatedStates properties.
2) Set the game.IsFixedTimeStep to true and use Space.Update() without passing in a time. This will technically still exhibit jumps because the game itself can perform a varying number of updates between draw calls, but sometimes the jumping will be less noticeable because the entire game is doing it consistently.
3) Set game.IsFixedTimeStep to false and use Space.Update() without a parameter (and without modifying the Space.TimeStepSettings.TimeStepDuration on the fly, which is generally bad for stability). This guarantees a fixed number of time steps per draw call at the cost of simulation framerate coupling. For some games, this can be a viable option. When the game drops below 60 fps, the simulation slows down but there's still no jumpiness. Clients simulating at different speeds could introduce significant problems for a networked game, of course.
Curiously my work PC is a big Xeon 8 core jobby, it gets stutters while multithreaded on all cores, but no issues running on a single thread. I assume the overhead of threading is outweighing the benefit at that point?
Threading tends to scale
quite well. While I don't have an 8 physical core computer to test on, the 6-core 3930K scaled decently. There was a fluctuation past 9 threads on the simulation tests that I have yet to explain (it may have simply been some environmental quirk), but I expect that going all the way up to 16 threads would not be substantially worse than the 12 thread case. I doubt that the extra 4 threads would take it from 4x+ faster to slower than single threaded, especially considering that the tested simulation with the most contention actually scaled the best.
I suspect that the difference in performance causes the time to accumulate in such a way that it becomes more/less noticeable.
Bepu is by far the fastest and most solid I've used, I've managed to have a huge variety of bodies zooming around the mesh in ways that exploded all the others. After literally porting over, and over again, I can also say it was by far the easiest to integrate, it's about the only one that feels like the code was planned out before it was written.
... Even without the threading, Bepu was the fastest I've seen.
Glad to hear it's working well for you!
(apologies for the raptors death effect

)
No need to apologize- as an expert in raptor related simulation, that is a perfectly realistic portrayal.
