Черт подери! Буквально пару недель назад задумал попробовать себя в написании простенького игрового сервера. В качестве языка выбрал scala, так как выполняется на jvm и умеет выполнять java-код, а с джавой я знаком. Клиент собирался писать на флеше, поскольку флешер. Вы невероятно кстати со своими статьями! Просто ужастно удачное совпадение.
P.S. Знаю, что поплачусь за эти слова, но, блин, в такие моменты очень жаль, что нечем плюсануть!
Вы не поверите, но спид-хак не то что в таких вот поделках на коленке, а и в MMORPG с мировым именем — большая проблема с разными хитрыми методами решения.
Неа. В играх часто присутствуют всякие модификаторы скорости (зелья, лошади, грифоны, заклинания), так что определить превышения макс. скорости не так уж легко. Дальше — есть такая штука как телепорты — тут уж и вовсе за секунду игрок может прыгнуть через пол-мира. Кроме того, даже двигаясь с нужной скоростью можно двигаться под\над землей, через стены, над пропастью — это всё тоже нужно ловить. Особняком — замедленное падение и немотивированные полёты. И еще куча всего. Это нехилая такая задача — её решают с разной степенью успешности.
Может привести или к тормозам (клиент должен получить от сервера свои координаты) или к «телепортам» (клиент рисует картинку сам, а потом корректирует позицию по данным от сервера).
А может и не привести, всеж-таки. Тут вопрос грамотного отлова лага и программирования клиента в целом.
И с точки зрения безопасности данный вариант единственно верный. Нельзя доверять расчеты клиенту. ПОтому что в этом случае они могут быть скомпрометированы. (понятно, что не в рамках этой статьи об таких вещах говорить, но все же).
Обычно пользователи более терпимы к ошибкам предсказания клиента (их вы имели в виду под «телепортами»?), чем к тормозам лагам или читерам. Чтобы снизить нагрузку на сервер (избежать тормозов), можно чтобы клиент посылал и дельту (направление перемещения) и конечную точку, а проверять их соответствие выборочно (например, каждый 100-й запрос) и банить при не соответствии.
«многопользовательская» — это какая? massive-multiplayer или просто multiplayer? Если второе, то как выше уже говорили, совсем не понятно зачем клиенту доверять так много. Да и в первом случае это имеет смысл только для оптимизаций(освободить сервер от «лишних» расчетов). Чаще всего под клиентом понимают просто какое-то примерное или приближенное отображение игрового состояния, т.е. абсолютно вся логика на сервере, а от клиента получаем только его действия/команды. И если уж все-таки посылать: Клиент шлет свои координаты на сервер с какой-то периодичностью (Во время движения чаще)
Зачем так? Просто каждый кадр шлем с дельта-компрессией, соответсвенно если ничего не поменялось, нечего и отсылать будет.
Ну и TCP совсем не подходит для таких вещей, жаль что flash не поддерживает UDP сокеты. Хотя вон там у ребят получилось вроде неплохо :)
Если кому-то интересно, тут много информации по традиционному сетевому коду(не mmo):
* Source Multiplayer Networking
* Unreal Networking Architecture
* Quake3 Networking Model
А там хак то один — сервер слишком доверяет клиенту. Вот и скорость любая и телепортация и невидимость и любой терраморфинг (кажется) возможны не смотря на шифрование и прочие попытки.
Да и лаг если судить по косвенным признакам тоже один — утечки памяти.
Это будет multiplayer прототип плавно перетекающий в massive-multiplayer… )))
Клиенту будем доверять как родному, по той простой причине, что это всего лишь прототип, а не коммерческий продукт.
Я би с удовольствием почитал подобную серию статей о реализации такой игры на JavaScript (HTML5 canvas, comet/websockets) + NodeJs (ну или PHP/Python/Ruby) + какой-то NoSQL (MongoDb, CouchDb etc).
Никто не хочет написать ?:)
А что мешает вам самому написать такие статьи?
Ведь необязательно быть экспертом по технологиям.
Достаточно будет если вы начнете в них разбираться и по ходу освоения писать статьи как и что у вас получается…
Почему бы Вам сразу не публиковать исходники на github/bitbucket/code.google.com параллельно с разработкой? В статье можно будет сразу отсылать к конкретным коммитам. Вы ведь всё равно в конце покажете исходный код? Изначально репозиторий будет пустой, но по мере написания статей код будет нарастать, а наблюдать за разработкой, я думаю, многим будет интересно, особенно паралельно читая Вашу серию статей.
Пьеса «Разработка многопользовательской сетевой игры.» Часть 1: Архитектура