» » » Реверс-инжиниринг «Казаков», часть третья: напёрстки в LAN

 

Реверс-инжиниринг «Казаков», часть третья: напёрстки в LAN

Автор: admin от 21-10-2016, 15:10, посмотрело: 370

Реверс-инжиниринг «Казаков», часть третья: напёрстки в LAN

На дворе конец 2016 года, наконец-то, вызвав бурю восторга среди фанатов, вышла третья часть «Казаков»… А мне всё не давала покоя странная ошибка в сетевой компоненте первой части. Странность заключалась в том, что при создании игры в локальной сети нормально запустить игру могли только два человека. При трёх игроках индикатор загрузки рос мучительно медленно, а начиная с четырёх и вовсе оставался на отметке 0%. Что ж, начнём расследование!

Проявление ошибки


Симптомов у проблемы сразу несколько. Значение «max ping», которое отображается в игровой комнате, слишком высоко и растёт пропорционально количеству игроков. Хотя все игроки подключены к одному коммутатору и обычный icmp ping выдаёт стабильно меньше 1 мс, в игровой комнате отображаются задержки вплоть до 350 мс. Если в комнате всего два игрока, то «max ping» сначала равен ~90 мс, затем падает посекундно до ~10 мс.

Второй симптом это отображение предупреждения «no direct connection established with: имя игрока». Втроём шанс получить его где-то 50%, а если в комнате четыре игрока, то оно показывается постоянно. Хотя это предупреждение и можно игнорировать, удерживая клавишу Ctrl при нажатии на «Start», это указывает на некоторую «проблему восприятия» качества соединения со стороны игры.

Третий симптом это медленная скорость загрузки. Когда все игроки нажали «Start», у хоста игры отображается индикатор в процентах. Он увеличивается шагами по ~8%, достигает 100% и лишь после этого можно начать игру. Учитывая то, что этот индикатор в первую очередь отображает прогресс передачи файла случайно созданной карты от хоста к игрокам, а размер этого файла для обычной карты равен примерно 3,5 МБ, то даже 5 секунд загрузки в гигабитной локальной сети являются проблемой. А за то время, которое требуется для «загрузки» трёх игроков можно скопировать всю папку с игрой.

Начинаем с конца


С вашего позволения я избавлю вас от подробностей начала этого реверса и возникших проблем. Скажу только, что я ошибался, думая, что разбирать сетевую составляющую будет весело. Вызов функций через указатели. Многопоточность. Работа с sendto() и recvfrom() одновременно с использованием DirectPlay. Отсутствие какой-либо внятной документации к этому динозавру, не говоря уже об отладочной информации. Моего кунг-фу здесь было явно недостаточно.

Так что будем работать по старинке. Открываем всеми любимую, первой статье. Тогда я не до конца разобрался с ролью функций QueryPerformanceFrequency() и QueryPerformanceCounter(). Как верно подметил Андрей Smi1e, было не похоже, чтобы они влияли на тайминг. Сейчас я могу точно сказать, что эти функции используется в игровой комнате первых «Казаков» как генератор псевдослучайных чисел для создании файла случайной карты и/или имени этого файла, а собственно тайминг игры осуществляется исключительно через GetTickCount().

На этом всё, до новых встреч!

Ссылки




Источник: Хабрахабр

Категория: Программирование » Веб-разработка

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *