Podrias implementar las animaciones de Canvas. Es muy abstracto asi, pero por lo que entiendo de tu codigo, estas redibujando TODO el canvas en cada iteracion, porque veo que no estas moviendo nada, solo bibujando, y eso es una pesadilla en temas de rendimiento, estas renderizando todo el canvas completo en cada frame...no seria mas practico dejar el fondo estatico y solo mover la serpiente? en cada frame solo estarias renderizando los cambios con respecto al frame anterior, eso te daria muchisimo mas movimiento, ademas podrias usar animaciones de desplazamiento, rotacion y escaldo.
https://developer.mozilla.org/es/docs/Web/Guide/HTML/Canvas_tutorial/Basic_animations