Как сообщают на reps.ru,
некий R1CH в своей статье на tl.net рассказал об
особенностях сетевого подключения StarCraft2 Beta. В игре
встроен командный буфер, который предназначен для сглаживания игры при
высоких лагах. С другой стороны он автоматически добавляет некий
дополнительный пинг, который нельзя исправить никаким редактированием.
Введение
StarCraft2 запускается через удаленный сервер, как например HoN. Не p2p
как было в BroodWar, а через удаленную машину-сервер. Blizzard - хост
игры, а не вы. Протокол - TCP, а не UDP как было ранее. Я не знаю,
почему решили использовать TCP/IP, ведь при равных условиях этот
протокол проигрывает по пингу из-за потерянных пакетов. Вероятно, они не
хотели ломать голову с фрагментацией или NAT.
"Дропхак" и обычные лаги
Так как другие игроки так же подключаются к серверу Blizzard, а не к
вам, то возможность "дропхака" исключена полностью. Дропхак позволяет
прервать соединение какими-либо способами, и десинхронизировав
соединение, выкинуть вас из игры. В StarCraft2 соединение идет через
сервер, все что можно сделать - отключить себя с сервера. Сервер же
остается жив, и сможет определить, кто остался в игре. Он будет
победителем и получит очки.
Тем не менее, остается потенциальная угроза отправки каких-нибудь
баг-пакетов, которые бы обрубали сервер. Но здесь мы предполагаем, что
уровень защиты, и вообще вся система сервера не позволяет это сделать
(ну или в крайнем случае, баг будет исправлен в два счета).
Вы могли заметить, что окно Waiting for players появляется довольно
часто. Сервер настроен так, что при лаге одного игрока, на паузу
ставятся все остальные. Типа не честно было бы продолжить игру, чтобы
"нелагающий" игрок перемикрил, или, того хуже, поймал на муве
лагающего, пока тот не в состоянии что-то сделать. В теории же, можно
сделать как в HoN'е - если игрок лагает, это его проблемы, у остальных
все хорошо. С другой стороны, такая система позволяет зайти в игру
миллиону обсов. Если обс лагает, кому есть до этого дело?
Port Forwarding
Настраивать порт-форвардинг не нужно. Вы подключаетесь к Battle.net'у
как к репсам. Опять же, это решает вопрос с proxy: 1x1 это, 2x2, 3x3 -
разницы нет.
Мапхак
Небольшой технический взгляд на мапхаки. Соединение идет через сервер,
технически возможно полностью избавиться от мапхака (сервер отправляет
игроку только то, что он "может видеть"). HoN так делает. Но в HoN'е
мало юнитов, это ж как DotA, но в случае войны лимитов (тем более в
каком-нибудь 4x4, где воюют 4 тосса с батонами). Это означает, что как
только лимит входит в зону вашей видимости, сервер должен отправить в
одно мгновение пару мегабайтов. При этом не должны теряться пакеты,
иначе будет лаг. И если это каким-то хитрейшим способом можно
рассчитать, ссылаясь на скорость и вектор движения юнитов, то точка
скана - чисто случайная точка для сервера.
То есть в теории можно замутить очень хитро, но на практике от этого
пострадает пинг, а пинг в RTS крайне важен.
Улучшаем латентность
Как уже было сказано, SC2 использует TCP. TCP разработан так, что пинг
вторичен по отношению к скорости передачи данных. Практически все
стрелялки используют UDP из-за этого. Особенность TCP - точная передача
данных. Если пакет утерян, его нужно переслать заново (а игра в этот
момент подлагивает).
Меняем TcpAckFrequency на единичку:
Запускаем редактор реестра (Пуск - выполнить - regedit), затем
переходим на закладку:
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Services
Tcpip
Parameters
Interfaces
Здесь должен быть ключик IPAddress с вашим IP. Здесь же правой
кнопкой создаем новый ключ DWORD, называем его TcpAckFrequency,
значение "1".
Почему это работает?
Обычно TCP отправляет запросы на подтверждение получения пакетов. Это
происходит до тех пор, пока сервер не получит ответ, либо не прекратит
это дело по тайм-ауту. Таймаут может произойти из-за того, что
отправляющая сторона ожидает от вас подтверждение (ack). Установив
TcpAckFrequency на единичку, вы отправляете подтверждение сразу после
получения данных. Обратите внимание, что это повышает требование
каналу, т.к. вы будете отправлять в разы больше данных.
Что может помочь
Если вы сидите на ADSL'е, соединение может использовать метод
interleaving, который уменьшает подверженность всяким ошибкам, но опять
же, добавляет пинг. В настройках ADSL модема стоит отключить эту
опцию. Опять же, качество проводов, шумы в телефоне, расстояние до АТС
(а также погода на Марсе и все такое прочее) может заставить вас
включить эту опцию (без нее все станет работать еще хуже). Можно
попробовать связаться с провом, объяснить задачу, но вероятность
получить ответ типа: "чоо0???77" крайне высока.
Провод против беспровода:
Правильно настроенная беспроводная сеть практически исключает лаг.
Тем не менее, если вы находитесь в местности буквально кишащей шумами
на частоте 2.4 гигагерца, пинг может стать существенным. Пинг до
правильно настроенного роутера - 1-2ms. Если больше - провод вам в
помощь.
На дешевеньких картах по беспроводу также можно получить лаг в момент
сканирования точек доступа. WlanOptimizer'ом можно отключить
сканирование, но он только для Висты/Вин7.
ХР-ишникам можно посоветовать подкрутить RWIN. Информации много,
гуглится легко.
Что не поможет
В сети миллиард твиков, которые типа "улучшают интернет". Как правило
их задача сводится к подкрутке значений TCPNoDelay,
NetworkThrottlingIndex, TcpDelAckTicks, отключению QoS Packet
Scheduler. Можно конечно попасть на уникальный для себя твик-артефакт
(один из сотни), который даст нужный результат. Но у другого он
работать уже не будет. Тут стандартные настройки - лучший выбор.
|