requestAnimationFrame instead of setInterval on client