XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
DioD

offline
Опыт: 45,134
Активность:
DeSync
Решил вот рассказать что такое десинк чем он вызван и как его избежать, но вот статьи писать не умею...
Ближе к делу - задавайте вопросы.
  1. Десинк, это изменение хода игры у одного или нескольких игроков независимо от хоста.
Вызывает отключение игроков от игры.
Десинк хоста вызывает отключение всех игроков.

Отредактировано DioD, 16.01.2007 в 19:33.
Старый 16.01.2007, 16:52
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
Код:
Десинк хоста вызывает отключение всех игроков.
- это в каком смысле "Десинк хоста" ? Мне казалось что десинхронизация данных может быть только у клиента т.к. данные сервера сопоставляются с данными клиента и в случае "неизбежной" разници клиент автоматом отсоединяется. Или нет ?
Старый 16.01.2007, 19:29
DioD

offline
Опыт: 45,134
Активность:
десинк хоста это действия на машине хоста в обход сетевого трафика, машина считает что это все остальные игроки хитрят, и разъединяет, хотя это совсем не так.
Старый 16.01.2007, 19:32
tysch_tysch
Работаем
offline
Опыт: отключен
Хитрят? т.е. десинк - это некая защита от читерства?
Старый 16.01.2007, 19:45
DioD

offline
Опыт: 45,134
Активность:
само собой, вот сам подумай, ты отредактировал память и начитерил себе мильон золота, как можно тебя наказать кроме дисконекта?
Старый 16.01.2007, 19:49
Iron
Листовой
offline
Опыт: 24,427
Активность:
DioD, я бы не делал столь поспешных выыодов. Сопоставление данных необходимо скорее для уменшения объема траффика. Т.е. все происходит так, что данные передаются между машинами только в ключевые моменты, в остальное же время все данные для всех игроков прощитываются на каждой машине автономно (кроме рандом значений естессно). Т.е. , например, один из игроков построил героя, всем остальным передается инфа о том что создан герой и его экспиренс равен 0, затем когда герой убивает юнитов, то рассчет опыта у данного героя ведется на каждой машине отдельно и не сверяется после каждого убитого крипа. И если наш игрок с героем решит почитерить и добавить экспиренса, то сначала ничего не произойдет, т.к. данные о новом экспиренсе будут только у него, но вот как только герой получит лвл, то произойдет передача данных о лвлап-е героя другим компам, но по их рассчетам он еще не должен повысить лвл. Вот тогда и возникает десинк.
Т.е. я считаю десинк это сугубо практичная весчь, ведь если бы каждое значение всегда сверялос, то я повесился бы на сетевом кабеле или продался в рабство провайдеру.
Старый 16.01.2007, 23:20
DioD

offline
Опыт: 45,134
Активность:
увы контрольные значения передаются после каждого действия.
нанесён урон - трансляция - умер ли юнит
не умер == десинк
так как у хоста он умер
или наоборот, у хоста юнит имеет на 100 хп больше, у всех умрёт, у него нет, вот всех и кикнет из игры.
Старый 17.01.2007, 06:23
nic666

offline
Опыт: 5,612
Активность:
Цитата:
данные для всех игроков прощитываются на каждой машине автономно (кроме рандом значений естессно)

Если ты имеешь ввиду триггеры, то они вообще ВСЕ выполняются только на сервере...

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

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

Это дает возможность читерства сервером.... если механизм проверки событий на возможность отключить, то можно на сервере делать все что угодно...

nic666 добавил:
Цитата:
затем когда герой убивает юнитов, то рассчет опыта у данного героя ведется на каждой машине отдельно и не сверяется после каждого убитого крипа.

ничего подобного! На сервер передаются события и все это обсчитывает только сервер. От сервера приходит команда "установить ХП в <значение>"
Старый 17.01.2007, 10:03
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Цитата:
Если ты имеешь ввиду триггеры, то они вообще ВСЕ выполняются только на сервере...

На каком серевере? Сервера нет в и помине. Скрипты выполняются на каждой машине отдельно и сихронизируются... Если по твоему весь скрипт выполянется на стороне серевера, то как по твоему работает блок на клинетской машине:
Код:
if Player(i) == GetLocalPlayer() then
    ... 
endif
Старый 17.01.2007, 10:16
DioD

offline
Опыт: 45,134
Активность:
в варе пиринговая система, если хост выходит игра не кончается
Старый 17.01.2007, 10:22
nic666

offline
Опыт: 5,612
Активность:
Цитата:
На каком серевере? Сервера нет в и помине. Скрипты выполняются на каждой машине отдельно и сихронизируются... Если по твоему весь скрипт выполянется на стороне серевера, то как по твоему работает блок на клинетской машине:
if Player(i) == GetLocalPlayer() then
...
endif

сервер выполняет все скрипты так, как если бы они работали у клиента... создается виртуальная среда для каждого клиента... дальнейший обмен данными это
событие от клиента-> на сервер
реакция от сервера-> клиенту


При этом каждый клиент имеет полную копию данных по каждому игроку, поэтому если хост уходит, то система обработки триггеров на клиенте перезапускается т.е. все начинает работать только на клиенте...
Вы можете проверить, что триггер прерывается при выходе хоста... Это и говорит о перезапуске системы обработке триггеров у клиента при его выходе...
Старый 17.01.2007, 11:04
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Позовите кто-нить НТ... =) Он доходчиво объяснит...
Старый 17.01.2007, 11:24
NETRAT

offline
Опыт: 83,712
Активность:
Насколько мне известно, в варе сервер - достаточно уловное понятие. Скрипты выполняются локально и постоянно синхронизуются. Действие, вызванное на компе одного из игроков вызывает событие на каждом из компов, поэтому, скажем, если действие применяется к обьекту, который существует не на всех компах, это и порождает разрыв соединения.
Можно считать что это защита от читерства, однако, в любой программе могут быть ошибки, которые просто невозможно исправить ибо непонятно как их исправлять, в таких случаях просто ставится точка выхода. То же самое и при десинхронизации - непонятно как синхронизовать данные - с каким компом - как устанавливать жизни юнита, который на одном компе существует, а на другом - нет (в играх, ориентированных на сервер, данные всегда берутся с сервера и считается что они единственно верные), поэтому в случае десинхронизации мы получаем точку выхода, которая явно сигнализирует о некорректном скрипте карты.
В варе не используется сервер как таковой, иначе в случае выхода сервера все бы умирало (иначе должна происходить смена сервера - это дополнительный же траффик и геморрой) и это дополнительная нагрузка траффика на сервер - если бы сервер был не очень быстрый, то лагало бы все. При выходе игрока он просто исключается из списка синхронизуемых компов.
Старый 17.01.2007, 16:33
DioD

offline
Опыт: 45,134
Активность:
всё равно одна из машин ведущая
Старый 17.01.2007, 16:56
Iron
Листовой
offline
Опыт: 24,427
Активность:
Цитата:
увы контрольные значения передаются после каждого действия.

нанесён урон - трансляция - умер ли юнит

не умер == десинк

так как у хоста он умер

или наоборот, у хоста юнит имеет на 100 хп больше, у всех умрёт, у него нет, вот всех и кикнет из игры.

Ты сам себе противоречишь, т.е. ты утверждаешь что ВСЕ данные синхронизируются и в то же время говоришь, что десинк будет только когда юнит умрет. Т.е. по твойму данные о разности хелсов передаются, но в то же время не вызывают десинка. Противоречие? Да, так что на самом деле передается только демаг (т.к. рандомная величина) по юниту, а вот его хелсы обсчитываются отдельно. Десинк же вызовет лишь смерть юнита, т.к. данные о смерти передадутся между компами.

Не веришь мне, проверь на примере опыта героя, как я писал в прошлом посте.

Iron добавил:
Цитата:
На каком серевере? Сервера нет в и помине. Скрипты выполняются на каждой машине отдельно и сихронизируются... Если по твоему весь скрипт выполянется на стороне серевера, то как по твоему работает блок на клинетской машине:

exploder, ты отчасти прав, но отчасти и нет. Есть все же некоторые нагрузки которые обрабатываются только на 1-й машине. Есть тому 1-о ЖЕЛЕЗНОЕ доказательство. Когда в батле кто-нибудь создает пользовательскую игру и если у всех зашедших будет фаервол, то если захостивший выйдет во время игры, то у всех будет дисконнект. Так что тут бабка на двое сказала.

Iron добавил:
Цитата:
в варе пиринговая система, если хост выходит игра не кончается

Да, не кончается, просто функции хоста перекладываются на другого игрока.

Iron добавил:
Цитата:
В варе не используется сервер как таковой, иначе в случае выхода сервера все бы умирало (иначе должна происходить смена сервера - это дополнительный же траффик и геморрой)

Вот какраз то и происходит смена сервера.

Блин, не верите - проверьте.

PS: НА ладдерных играх походу сервером выступает сервак близзов.
Старый 17.01.2007, 18:16
DioD

offline
Опыт: 45,134
Активность:
достаточно было допусть одну оговорку и вот
  1. В варе НЕТ сервера как такого, есть ведущая машина
  2. Десинк вызывается разницей в контрольной сумме процесса
создайте триггер для локального игрока, будет сразу десинк, даже если триггер не работает.
  1. Ведущая машина контролирует данные каждого "клиента"
пока нет нового хоста игра в паузе, если хоста нет то игрок становиться хостом сам себе
  1. Всё считается на каждой машине, передаются только действия игроков и контрольные суммы
  2. В ладдере хост есть сервак близов и игроки не подключены друг к другу
Старый 17.01.2007, 18:33
Iron
Листовой
offline
Опыт: 24,427
Активность:
Вот и добрались до истины.
Старый 17.01.2007, 22:03
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Цитата:
5) В ладдере хост есть сервак близов и игроки не подключены друг к другу

Неправда, в ладдере тоже сервит один из игроков...
Старый 18.01.2007, 12:42
DioD

offline
Опыт: 45,134
Активность:
логи фаервола дать?
Старый 18.01.2007, 12:43
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
У нас в гостевом инете стоит сервак вара, так вот он не пашет изза того, что клинеты не могут общатся напрямую в обход сервера. Даже в ладдере есть траффик между игроками...

exploder добавил:
Точнее сервак-то пашет, игра начинается, но потом сразу же рвется изза десинка...
Старый 18.01.2007, 12:52
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 21:38.