Как улучшить пинг в Starcraft 2 - Статьи о Battle.net - Различные статьи - Каталог статей - Starcraft 2, Старкрафт 2 - стратегии, реплеи, карты
Старкрафт 2 - воплощение легенды
· RSS ·
Меню сайта
Категории раздела
Статьи о Battle.net [1]
Интервью с топ-игроками [0]
Юмор [1]
Разное [3]
Статистика
 Каталог статей
Главная » Статьи » Различные статьи » Статьи о Battle.net


Как улучшить пинг в Starcraft 2

Начнем эту статью с того, что вспомним как весной этого года лидер команды R1CH в своей статье на tl.net поведал об особенностях сетевого подключения Starcraft 2.

При этом давайте сразу договоримся о том, что под "латентностью", "пингом" или "лагом" будем понимать именно сетевой пинг (тот, который зависит непосредственно от проводов). Также вспомним что в игру Starcraft 2 встроен специальный буффер,  предназначенный для сглаживания игры при больших лагах. Но если посмотреть на это с другой стороны, то он фактически автоматически добавляет некоторый дополнительный пинг, который невозможно исправить никакими подрутками.

Основы


Starcraft 2 запускается через удаленный сервер, как например HoN. То есть получается не p2p (point-to-point, соединение типа точка-точка) соединение как было в первом старкрафте, а через удаленную машину-сервер. В этом случае в Starcraft 2 хостом игры является сервер, принадлежащий Близзард, а не вы (в данном случае не тестировались произвольные игры, в них процессы могут быть немного другими). Также используется протокол TCP (Transmission Control Protocol), а не UDP как было в первом стракрафте. При этом непонятно почему в Близзард решили использовать именно пару протоколов TCP/IP, ведь при одинаковых условиях этот протокол проигрывает по пингу из-за потерянных пакетов. Вероятно, они не хотели мучаться с фрагментацией или NAT.

"Дропхак" и обычные лаги

Т.к. другие игроки так же подключаются к серверу Blizzard, а не к вам, вохможность "дропхака" (так популярного в Warcraft 3), исключается полностью. Дропхак позволяет прервать соединение какими-либо способами, и десинхронизировав соединение, выкинуть вас из игры. А так как в Starcraft 2 соединение идет через сервер, все что можно сделать - дискнуть себя с сервера. Сервер же остается жив, и сможет адекватно определить, кто из игроков остался в игре. Таким образом он легко определит победителя и начислит ему очки за победу.

Но все же при таком способе подключения остается потенциальная угроза отправки каких-нибудь баг-пакетов, которые бы намеренно обрубали сервер. Но здесь мы предполагаем, что уровень защиты сервера (наверняка Близзард вложила в это дело неплохие деньги) не позволяет это сделать (ну или в крайнем случае, баг будет пофиксен в два счета).

Вы могли заметить, что окно Waiting for players появляется сравнительно часто. Это случается из-за того, что сервер настроен таким образом, что при лаге одного игрока на паузу ставятся все остальные. То есть не честно было бы продолжить игру, чтобы "нелагающий" игрок перемикрил, или, что хуже, поймал на муве лагающего, пока тот не в состоянии что-либо сделать. В теории же, можно сделать таким образом как в HoN'е - если игрок лагает, это его проблемы, у остальных все хорошо. С другой стороны, такая система позволяет зайти в игру хоть миллиону зрителей. Если обс лагает, кому есть до этого дело?

Port Forwarding

Настраивать при игре в Starcraft 2 порт-форвардинг не нужно. Вы подключаетесь к battle.net'у как к репсам. Опять же, это решает вопрос с proxy: 1x1 это, 2x2, 3x3 - разницы абсолютно никакой нет.

Мапхак

Небольшой технический взгляд на возможность использования мапхаков. Так как соединение идет через сервер, теоретически возможно полностью избавиться от мапхака (сервер отправляет игроку только то, что он "может видеть"). HoN так делает. Но в HoN'е мало юнитов, это ж как DotA, но в случае войны лимитов (тем более в каком-нибудь 4x4, где воюют 4 тосса с батонами). Это означает, что как только лимит входит в зону вашей видимости, сервер должен отправить в одно мгновение пару мегабайтов. При этом не должны теряться пакеты, иначе будет лаг. И если это каким-то хитрейшим способом можно расчитать, ссылаясь на скорость и вектор движения юнитов, то точка скана - чисто случайная точка для сервера.

То есть в теории можно создать какой-нибудь хитрый мапхак, но на практике от этого существенно пострадает пинг - то есть ни вы, ни другие игроки уже не смогут комфортно играть. Я думаю вряд ли кто пойдет на это.

Улучшаем латентность

Как уже было сказано, игра Starcraft 2 использует TCP протокол. При этом TCP разработан таким образом, что пинг вторичен по отношению к скорости передачи данных. Практически все стрелялки используют UDP из-за этого. Достоинство TCP - точная передача данных. То есть если пакет утерян, то его нужно передать заново (а игра в этот момент подлагивает).
Тем не менее, можно подкрутить коннект следующим образом:
Меняем TcpAckFrequency на единичку
Запускаем редактор реестра (Пуск - выполнить - regedit), затем переходим на закладку:

HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Services
Tcpip
Parameters
Interfaces

Здесь должен быть ключик IPAddress с вашим IP-адресом. Здесь же правой кнопкой создаем новый ключ DWORD, называем его TcpAckFrequency, значение "1".

Почему это работает?

Обычно протокол TCP отправляет запросы на подтверждение получения пакетов. Это происходит до тех пор, пока сервер не получит ответ, либо не прекратит это дело вследствие тайм-аута. Таймаут может произойти из-за того, что отправляющая сторона ожидает от вас подтверждения приема. Установив TcpAckFrequency на единичку, вы отправляете подтверждение сразу после получения данных. Обратите внимание, что это повышает требование к каналу, так как вы будете отправлять в разы больше данных.

Что может помочь

Если вы сидите на ADSL'е, соединение может использовать метод interleaving, который уменьшает подверженность всяким ошибкам, но опять же, добавляет пинг. В настройках ADSL модема стоит отключить эту опцию. Опять же, качество проводов, шумы в телефоне, расстояние до АТС (а также погода на Марсе и все такое прочее) может заставить вас включить эту опцию (без нее все станет работать еще хуже). В этом случае можно попробовать связаться с провайдером, объяснить проблему, но вероятность того что вам помогут, невысока.

Проводная сеть против беспроводной сети:
Правильно настроенная беспроводная сеть практически исключает лаг. Тем не менее, если вы находитесь в местности буквально кишащей шумами на частоте 2.4 гигагерца, пинг может стать весьма значительным. Пинг до правильно настроенного роутера - 1-2ms. Если больше - провод вам в помощь.

На дешевых картах по беспроводной сети также можно получить лаг в момент сканирования точек доступа. WlanOptimizer'ом можно отключить сканирование, но он только для Висты/Windows 7.

Для тех кто еще юзает Windows XP можно посоветовать подкрутить RWIN. Информации по этому поводу много, можно найти при помощи поисковиков.

Что точно не поможет

В сети лежат миллиарды твиков, которые типа "улучшают интернет". Как правило их задача сводится к подкрутке значений TCPNoDelay, NetworkThrottlingIndex, TcpDelAckTicks, отключению QoS Packet Scheduler. Можно конечно попасть на уникальный для себя твик-артефакт (один из сотни), который даст нужный результат. Но у другого он работать уже не будет. Тут дефалтные настройки (те, которые стоят по умолчанию) - лучший выбор.
Категория: Статьи о Battle.net | Добавил: Admin (03.10.2010)
Просмотров: 6254 | Комментарии: 2 | Рейтинг: 0.0/0
Всего комментариев: 2
1  
Да и твоя писанина такая же шляпа которая не работает и ничем не отличается от этих "милилардов твиков"

2  
Некоторые не знают даже тех основ, которые описаны в данной статье. Поэтому, я думаю, эта статья будет для кого то полезной

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2016
Поиск
Друзья сайта
  • нет пока
  • Конструктор сайтов - uCoz