particles are utterly fps dependent, replicate vanilla behaviour in calling updateparticles()