| Создание реал-тайм сетевой игры | 
|  | 
| 
| zodiak | Дата: Вторник, 17 Июля 2012, 11:56 | Сообщение # 21 |  |   постоянный участник Сейчас нет на сайте | Quote (Qvant) по TCP если он не дошёл то вернётся ошибкаОшибка вернется, если нет связи, иначе пакет будет отправлен повторно.
 
 
 Quote (Qvant) шлём n пакет на сервер шлём n+1 пакет на сервер шлём n+2 пакет на сервер шлём n+3 пакет на серверQvant, Только вот в UDP пакеты имеют свойство приходить не по очереди. Придется его расшифровать, идентифицировать, пихнуть в нужное место, определить отсутствующие, отправить на них запрос. Я не хочу спорить, просто это или сложно. Возможно гуру сети напишет это с закрытыми глазами задней ногой. Но лучше уж пользоваться надежным ТСП чем править кучу косяков в коде.
 
 Точка зору окремо взятого індивіда завжди суб'єктивна!
 
 Взломщик
 Battle City.Net
 |  |  |  |  | 
| 
| Qvant | Дата: Вторник, 17 Июля 2012, 12:13 | Сообщение # 22 |  |   почти ветеран Сейчас нет на сайте | Quote (zodiak) Ошибка вернется, если нет связи, иначе пакет будет отправлен повторно.У меня в тестах при открывании TCP из 10000 соединений , 3-4 соединения разрывались на локалхосте....редкие передачи данных без сбоев
 А вот если нагружал ЦПУ сервера на 100% , тогда при любом количестве соединений полезли ошибки при передачи пакетов - соединения не рвались а пакеты терялись.
 Сервер неуспевал их обрабатывать и принимать
 
 то что пакеты могут придти не по по порядку я писал выше (внутри каждого пакета посылается его номер )а на сервере конечно придётся делать приорететную очередь и добавить тайм аут на ожидание неприбывшего пакета , если в течении этого времени он не пришёл , тогда считаем его пропавшим.
 |  |  |  |  | 
| 
| Vinchensoo | Дата: Вторник, 17 Июля 2012, 13:30 | Сообщение # 23 |  |   Злобный социопат с комплексом Бога Сейчас нет на сайте | Quote (Qvant)  Простенькая проверка на сервере сравниваем полученое время от клиента с временем на сервере.Ага, и баним людей за то, что у них время отстает или часовой пояс другой.
 
 
   |  |  |  |  | 
| 
| Archido | Дата: Вторник, 17 Июля 2012, 13:37 | Сообщение # 24 |  |   Сэнсэй Сейчас нет на сайте | Quote (Vinchensoo) Ага, и баним людей за то, что у них время отстает или часовой пояс другой.Это не системное время
  , это внутриигровое время, которое периодически синхронизируется между клиентом и сервером. 
 C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
 
 
 Сообщение отредактировал Archido - Вторник, 17 Июля 2012, 13:38 |  |  |  |  | 
| 
| Qvant | Дата: Вторник, 17 Июля 2012, 13:40 | Сообщение # 25 |  |   почти ветеран Сейчас нет на сайте | при первом соединении конечно нужно синхронизировать клиент с сервером .... клиент получает данные о времени с учётом пинга и запускает свой внутренний таймер
 
 PS. а на системное время и часовой пояс вообще тут не причём.
 
 PS2. синхронизировать можно и один раз при соединении , если конечно пользователь не играет не прырывно неделями
   
 
 Сообщение отредактировал Qvant - Вторник, 17 Июля 2012, 13:42 |  |  |  |  | 
| 
| Vinchensoo | Дата: Вторник, 17 Июля 2012, 13:47 | Сообщение # 26 |  |   Злобный социопат с комплексом Бога Сейчас нет на сайте | Archido, Qvant, и в чем логика тогда?) Думаете, что кто-то сможет подменить пакет, но не сможет найти время?
 Детские методы какие-то.
 
 
   |  |  |  |  | 
| 
| Archido | Дата: Вторник, 17 Июля 2012, 13:53 | Сообщение # 27 |  |   Сэнсэй Сейчас нет на сайте | Quote (Qvant) синхронизировать можно и один раз при соединении , если конечно пользователь не играет не прырывно неделямиИгра может запускаться на разных платформах (разные архитектуры процессоров), разные тактовые генераторы могут быть в конце концов
  , да и какие-либо внешние условия. Помнится у каких-то процессоров AMD был баг, где как раз ТГ давал сбои на многоядерных процессорах. Поэтому, скажем, раз в 10 мин проводить синхронизацию времени вполне нормальная практика  , хуже уж точно не станет   
 C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
 |  |  |  |  | 
| 
| Qvant | Дата: Вторник, 17 Июля 2012, 13:54 | Сообщение # 28 |  |   почти ветеран Сейчас нет на сайте | Нам не нужно знать конкретное время у пользователя на ПК , нам важно относительное время когда он начал двигаться - чтоб устранить лаги при отрисовки этого игрока в других клиентах которые рядом с ним... |  |  |  |  | 
| 
| Archido | Дата: Вторник, 17 Июля 2012, 14:05 | Сообщение # 29 |  |   Сэнсэй Сейчас нет на сайте | Vinchensoo Я про подмену ничего не говорил
  , я говорил, что это не системное время, а внутриигровое, на котором основывается т.н. "лаго-компенсация". Событие происходит в определенное время на клиенте (стрельба, например), клиент оправляет пакет серверу со штампом времени о этом событии, и сервер, получив это пакет спустя некоторое время (ping) может "откатить" игровой мир на дельту (а время у нас как раз синхронизировано) и проверить, попал ли клиент в кого либо в тот самый момент времени. Как-то так
  . Как оно поможет бороться с читерами, это не ко мне вопрос
   
 C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
 
 
 Сообщение отредактировал Archido - Вторник, 17 Июля 2012, 14:12 |  |  |  |  | 
| 
| Apati | Дата: Вторник, 17 Июля 2012, 14:11 | Сообщение # 30 |  |   заслуженный участник Сейчас нет на сайте | Quote (Qvant) В TCP при этом будут жестоки задержки - послали запрос на передачу пакета - ждём пришёл запрос , если сервер готов - посылаем пакет ждём ответ от сервер что пакет дошёл посылаем запрос на второй пакет...Запрос посылается только один раз, при инициализации соединения, а потом уже данные просто посылаются когда угодно, без запросов на передачу пакетов, а обратно возвращается подтверждение, что не тормозит передачу данных.
 |  |  |  |  | 
| 
| BabS | Дата: Среда, 18 Июля 2012, 11:13 | Сообщение # 31 |  | частый гость Сейчас нет на сайте | Забыли такую особенность в TCP - упаковка нескольких исходящих сообщений в 1 пакет )) |  |  |  |  | 
| 
| Qvant | Дата: Среда, 18 Июля 2012, 11:21 | Сообщение # 32 |  |   почти ветеран Сейчас нет на сайте | Quote (BabS) Забыли такую особенность в TCP - упаковка нескольких исходящих сообщений в 1 пакет ))нет я забыл про TCP со скользящим окном , с ним действительно можно сделать скорости почти такую же как и с UDP ... хотя реализиция этого алгоритма сложнее , он не ждёт подтверждения а сразу передаёт следующий пакет.
 А подтверждение приходит потом ...
 |  |  |  |  | 
| 
| AGENTX001 | Дата: Среда, 18 Июля 2012, 11:29 | Сообщение # 33 |  |   почётный гцупер Сейчас нет на сайте | BabS, это nagle алгоритм, он выключается) |  |  |  |  | 
| 
| BabS | Дата: Среда, 18 Июля 2012, 13:12 | Сообщение # 34 |  | частый гость Сейчас нет на сайте | AGENTX001, согласен, но человек начинающий и неплохо об этом напомнить. Несколько раз встречал страдание человека над кодом, забывшим об разных мелочах )) |  |  |  |  |