use rAF instead of setInterval