Из исходников agar io:
setInterval(moveloop, 1000 / 60);
setInterval(sendUpdates, 1000 / 40);
1) Иначе говоря, инфу о нажатии клавиш клиент отправляет сразу;
2) Сервер эту инфу принимает и 60 раз в секунду ведет перерасчет данных о состоянии поля;
3) Параллельно 40 раз в секунду сервер долбит клиента, отправляя данные о текущем состоянии поля.
5) И это работает (
https://github.com/huytd/agar.io-clone)
Но даже отправляя данные 40 раз секунду, можно увеличить фпс хоть до 300. Ведь в данных содержится информация лишь о положении объектов и их параметрах (скорость, направление), а прорисовка осуществляется исключительно на клиенте и никто вам не мешает задать объекту движение с любым фпс и продолжать его до тех пор, пока не придет новый пакет данных.