Как пишут обмен данными (сетевой движок) для компьютерных игр?
Какие известны хитрости, чтобы передавать меньше данных, не рискуя рассинхроном?
Чем меньше тик рейт сервера, тем меньше данных. Одно дело динамичный шутер(батла на 130 человек), а другое дело кооп игра на 4 человек.  В одних случая критичен высокий тик рейт в других нет.  Хотя... умереть в батле через секунду после того как ты забежал за стену благое дело...
Какие рассинхроны не критичны?
Опять зависит от игры.
В каком порядке происходит проигрывание на сервере того, что на клиенте было сделано, и как клиенты-друзья воспроизводят действия?
Ну почитайте какие нибудь статьи вот например на хабре
Мультиплеер в быстрых играх (части I, II)
Мультиплеер в быстрых играх (Часть III: появление ...
Мультиплеер в быстрых играх (Часть IV: Хэдшот! Пут...

В двух словах определитесь с направленностью игры, тик рейтом, частопердаваемые данные передавайте по протоколу UDP,  используйте интерполяцию для движений.
1) Можно передавать нажатие/отжатие клавиш/мыши серверу, а он меняет положение игрока и всем рассылает его новые позиции (как в world of tanks)
В то время, пока сервер считает, клиент может предсказать и сам у себя визуально переместить, а затем поправить положение с пришедшим от сервера положением.
+ все расчёты делает сервер => многие читы не работают (aim, teleport)
- высокий пинг

2) Можно передавать свою позицию серверу, а тот рассылает её другим клиентам (как в cs)
+ низкий пинг
- читеры могут фейковые данные посылать (aim, teleport)

3) Можно напрямую передавать всем клиентам (peer to peer)
- высокая нагрузка на сеть (т.к. все постоянно друг-другу шлют данные)
- простор для читеров