Показать сообщение отдельно
Старый 24.05.2017, 06:14
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 52  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
то он на основании этих инпутов симулирует всю игру и решает кто прав, а кто читер, и наказывает их.
Ну, эта задача, мягко говоря, очень трудновыполнимая. Собирание абсолютно всех инпутов на протяжении всей игры, каждое перемещение, каждый выстрел, каждый бросок гранаты и т.д., а потом повторно прогонять и смотреть где и что пошло не так... Что-то я тоже не представляю как это может помочь в решении спорной ситуации. Кинул игрок поддельный инпут, сервер его записал у себя, потом воспроизвел, получил ту же картину. Всем хорошо, читеров нет, бессмысленная двойная работа выполнена) Все эти проверки можно делать прямо в процессе игры.
Плюс к тому, довольно проблематично собирать все это и симулировать, если это не какие-нибудь нарды, а, скажем, World Of Wartanks.
Звучит утопически
Цитата:
Так если сервер таки должен уметь считать симуляцию сам,почему бы ему это не делать в realtime без запарок что что-то там может разойтись.
Отчасти соглашусь. Но по опыту могу сказать, что это не всегда возможно, некоторые расхождения неизбежны. Вот пример ситуации, которая была у меня: есть скорострельный пулемет. Игрок берет его и начинает стрелять. Пулемет совершает по 15 - 20 выстрелов в секунду. Вопрос: Как отправлять эти выстрелы серверу? Первое, что попытался сделать я - это решение "в лоб" создать короткий пакет, который содержал, позицию солдата игрока и направление выстрела. Стал слать эти пакеты для каждого выстрела. И быстро понял, что вариант этот очень плохой. Трафика сразу копится столько, что сеть начинает тормозить, а сервер не успевает принимать и обрабатывать все эти пакеты. Помножь все это хотя бы на несколько десятков игроков, я не говорю о сотнях, и получишь Denial of Service на своем серваке.
Второе решение было - послать направление выстрела и положение игрока при начале стрельбы, а так же количество патронов, которое есть на клиенте, а потом событие завершения стрельбы, так же с количеством патронов. Это дало некоторые преимущества: сеть перестала забиваться и сервер смог без проблем обрабатывать стрельбу и считать возможные попадания без особых напрягов. Но тут же всплыли и недостатки:
1) Так как сервер теперь сам считал расход патронов, а клиент сам, то появились рассинхроны. Я решил, что можно сделать допущение, если расхождение в контрольных суммах патронов будет + / - 5, то считать что клиент не читер и можно верить тому количеству, которое пришло с него. А если больше, то сервер шлет клиенту апдейт и количество патронов у него корректируется.
Казалось бы, все круто, проблема решена. Но не тут то было. Ситуации со сбоями в сети и тормозами железа никто не отменял. Стали всплывать ситации, когда событие завершения стерльбы просто где-то терялось и сервер не прекращал стрельбу, пока не кончались патроны, а клиент даже не подозревал об этом и бегал где-то в другом месте локации. Пришлось делать каждую секунду дополнительную проверку со стороны сервера. Он слал клиенту доп. сообщение heart_beat и если не получал ответа, то прекращал стрельбу и на всякий случай слал клиенту апдейт с текущим состоянием его боепрпасов.
Это улучшило положение, но проблему рассинхронов не решило на 100%.
Так что для некоторых видов игр, (особенно с активной движухой) никак нельзя быть уверенным, что всё на 100% синхронизировано. А значит и нельзя на 100% избежать читеров
__________________
Ко мне можно и нужно обращаться на ты)


Последний раз редактировалось caseyryan; 24.05.2017 в 10:59.