Интересную аналогию между сетевыми шутерами и UI тут нашёл.
Обычно, при игре по сети в стрелялку, эталонное состояние мира считается на сервере, а все клиенты - тонкие: показывают экстраполированное состояние, отправляют действия игрока. Сложная тут задача - реализация оружия мгновенного действия. Которое не выпускает «ракету» - обычный игровой объект, взрывающийся через какое-то время - а «снимает жизни» по клику мышью. Типичный пример - «снайперская винтовка». Сложность тут в том, что клиент всегда отстаёт от сервера. Там уже пришла и обработана команда противника на перемещение, в то время как на нашем клиенте мы об этом факте ничего не знаем. Игрок 100% уверен: вот противник в прицеле, я его точно держу на мушке, нажатие мыши приведёт к попаданию. Схема, обычно, следующая: когда на сервер приходит команда активации мгновенного действия, делается откат состояния модели данных назад, что бы понять, а что видел игрок у себя в момент выстрела. Откат может быть нетривиальным и учитывать, что клиент делает либо интерполяцию, либо экстраполяцию. Если игрок у себя действительно попал, то уже убежавший противник, извняй, но тебя подстрелили. Даже если твоя голова на твоём компьютере убралась из поражаемой зоны. Подробнее можно прочитать в книге «
Многопользовательские игры» (англ. «
Multiplayer Game Programming») от Джошуа Глейзера и Санджайя Мадхава.
А ведь в UI то же самое! Собственно, сам UI - это и есть тонкий клиент к модели данных. Сервер - это фоновая обработка данных нитями. Например, у нас строится индекс в IDE, и есть его «слепок» с каким-то отставанием на виду у пользователя. Оружие мгновенного действия - нажатие клавиши Enter или клик мышью.
Очень раздражает, когда вызываешь какой-нить «Go To …» в IDE, набираешь текст, начинает появляться выдача, ты видишь клавиатурный фокус, жмёшь Enter, и оп! В этот момент прогрузились новые данные от индексатора и ты ушёл не туда, куда хотел. А обработчик нажатий UI должен был построить слепок того, что видел пользователь, и обрабатывать команды именно в его контексте. Ещё такой бедой страдают почти все приложения на андроиде.
Тут, кстати, людям на заметку: клавиатурный фокус может отличаться от мышиного фокуса.