I am trying to implement client side prediction as in this article http://www.gabrielgambetta.com/fpm2.html
Currently I'm doing it like this: the game runs at 60 FPS. 60 times per frame I check if an arrow key is pressed, if so, I move the player character slightly and send the message about the movement done to the server (direction + delta time). The server applies the movement. On the next player positions broadcast, the server also sends the ID of the last_received_input. Client then updates the state based on what it received from the server, then reapplies all the inputs after the last_received_input.
It works in general. The problem is, that now client packet send rate is tied to the client framerate. If I keep rendering at 60 FPS, but check inputs/send input packets at only 30 FPS, I will start to experience jerky movement on the player character. How is it done properly? How to reduce the client tickrate, but still achieve smooth movement?