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

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

Ответ
 
ARHUI

offline
Опыт: 3,341
Активность:
Desync? А я в игре...
Не знаю что такое десинк, ни разу не сталкивался, однако всегда думал что это когда вар вылетает во время мультиплея, так вот добавил в карту новый спелл и где то в середине игры (может даже не из-за спелла) мне игра сообщила что все ливанули, хорошо был брат на скайпе, он сказал что ему написали будто бы я ливанул, через неоторое время у него тоже все ливанули... Игра при этом продолжалась. Вопросы:

Это десинк или что?

Есть ли статьи конкретно по десинкам и методам борьбы с ними?

Что вызывает подобное поведение?

Как бороться?
Старый 26.04.2011, 17:49
agentex

offline
Опыт: 34,834
Активность:
это сплит называется, разновидность десинка.
все просто, desynchronization или десинхронизация происходит изза несоответсвия данных у разных игроков во время работы карты. может быть спровоцировано чем угодно, от неправильного использования GetLocalPlayer() (локальное создание хендлов) до различий в архивах игры (да да, и такое бывает)
Старый 26.04.2011, 17:53
ARHUI

offline
Опыт: 3,341
Активность:
Есть ли статьи конкретно по десинкам и методам борьбы с ними?
Старый 26.04.2011, 18:02
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
поочерёдно выключать все GetLocalPlayer() и проверять на наличие проблемы
Старый 26.04.2011, 18:22
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
Цитата:
Сообщение от agentex
до различий в архивах игры (да да, и такое бывает)


Верно ли я понял, что в таком случае сама карта никак не виновата в том, что на ней происходят десинки?
И различаются ли архивы игры у лицухи и пиратки?
Старый 26.04.2011, 18:37
ARHUI

offline
Опыт: 3,341
Активность:
Проблема в том что каждый раз надо создавать игру на батле для проверки чего-то что может и не выползти...
Старый 26.04.2011, 18:41
Doc

offline
Опыт: 63,163
Активность:
Старый 26.04.2011, 18:45
agentex

offline
Опыт: 34,834
Активность:
Верно ли я понял, что в таком случае сама карта никак не виновата в том, что на ней происходят
десинки? И различаются ли архивы игры у лицухи и пиратки?
именно так. недавно с другом тестили карту, у него постоянно десинкало вначале игры. сначала подумал что дело в карте, хотя на инициализации все чисто. проверили на мили карте - тоже самое, заново скачал вар - все прошло
Старый 26.04.2011, 19:09
ARHUI

offline
Опыт: 3,341
Активность:
Цитата:
поочерёдно выключать все GetLocalPlayer() и проверять на наличие проблемы



разве GetLocalPlayer() не для того создан чтобы ссылаться на локального игрока

DisplazTextToPlayer(GetLocalPlayer(),0,"text") - покажет каждому игроку текст данные о котором не пойдут в сеть, или я не прав?
Старый 26.04.2011, 20:42
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
function des takes integer i returns nothing
        if GetLocalPlayer() == Player(i) then
            call CreateFogModifierRectBJ(true,Player(i), FOG_OF_WAR_VISIBLE, GetPlayableMapRect() ) 
        endif
endfunction
пожалуйста, десинк
Старый 26.04.2011, 20:45
reALien

offline
Опыт: 29,211
Активность:
Десинки бывают только от попыток локальной работы с синхронизуемыми данными.
Текст на экране, камера и прочая показуха не синхронизуется.
Старый 26.04.2011, 20:47
ARHUI

offline
Опыт: 3,341
Активность:
почему bj функции

Код:
function DisplayTextToForce takes force toForce, string message returns nothing
    if (IsPlayerInForce(GetLocalPlayer(), toForce)) then
        // Use only local code (no net traffic) within this block to avoid desyncs.
        call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, message)
    endif
endfunction


всегда делают эту проверку?
Старый 26.04.2011, 20:50
reALien

offline
Опыт: 29,211
Активность:
Не должно вызвать.
Старый 26.04.2011, 20:51
ARHUI

offline
Опыт: 3,341
Активность:
разве сразу писать

call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, message)

не разумно?

ARHUI добавил:
если я хочу всем игрокам одно и тоже сообщение вывести

ARHUI добавил:
у меня во всем коде GetLocalPlayer() встречается:

Код:
if(IsPlayerInForce(GetLocalPlayer(),bj_FORCE_ALL_PLAYERS))then
call DisplayTextToPlayer(GetLocalPlayer(),0,0,("|c00FF0000Player "+GetPlayerName(udg_players[a])+" has leaved the game... FOOL|r"))
endif

if(GetLocalPlayer()==GetEnumPlayer())then
set r=udg_hero_spawn_reg[udg_p_numbers[GetPlayerId(GetEnumPlayer())]]
set l=Location(GetRectCenterX(r),GetRectCenterY(r))
call PanCameraToTimed(GetLocationX(l),GetLocationY(l),0.50)
endif

call DisplayTextToPlayer(GetLocalPlayer(),0,0,(GetPlayerName(GetOwningPlayer(k))+" |cffff0000is a team killing bastard and will explode in 5 seconds"))


if(GetLocalPlayer()==local_player)then
call TimerDialogDisplay(l_timer_window,true)
endif

if(GetLocalPlayer()==local_player)then
call ClearSelection()
call SelectUnit(d,true)
set l2=GetUnitLoc(udg_hero_of_player[udg_p_numbers[player_id]])
call PanCameraToTimed(GetLocationX(l2),GetLocationY(l2),0.50)
endif


Тут есть проблемы?

ARHUI добавил:
могу предположить что при обращении к глобальной переменной происзодит сбой

set r=udg_hero_spawn_reg[udg_p_numbers[GetPlayerId(GetEnumPlayer())]]

?

ARHUI добавил:
локальные переменные ведь не синхронизируются - компы надо будет по шине соединять чтобы успеть синхронизировать))

ARHUI добавил:
Хотя нет, все переменные, которым задаются значения - локальные....
Старый 26.04.2011, 21:19
Anufis

offline
Опыт: 6,290
Активность:
Цитата:
Сообщение от ARHUI
if(GetLocalPlayer()==GetEnumPlayer())then
set r=udg_hero_spawn_reg[udg_p_numbers[GetPlayerId(GetEnumPlayer())]]
set l=Location(GetRectCenterX(r),GetRectCenterY(r))
call PanCameraToTimed(GetLocationX(l),GetLocationY(l),0.50)
endif

Локально будет создана локация. У одного игрока создана, у всех остальных нет. делай выводы об адресации хэндлов
Старый 26.04.2011, 21:25
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
ARHUI, ну самое простое - не создавай хендлы для через GetLocalPlayer(). Ещё функции не стоит запускать через него.
Старый 26.04.2011, 21:35
agentex

offline
Опыт: 34,834
Активность:
DisplazTextToPlayer(GetLocalPlayer(),0,"text")
такая конструкция вызывает десинк. (проверено) напрямую в аргументы локалплеер крайне нежелательно сувать.
set l2=GetUnitLoc(udg_hero_of_player[udg_p_numbers[player_id]])
создаешь хендл под локалплеером как выше сказали
Старый 26.04.2011, 21:37
ARHUI

offline
Опыт: 3,341
Активность:
Тоесть абсолютно однозначно это место надо поправить, иначе неизбежны пусть и нерегулярные ошибки?
Старый 26.04.2011, 21:50
agentex

offline
Опыт: 34,834
Активность:
однозначно нужно не использовать локации
локальные переменные ведь не синхронизируются, или как раз наоборот?
переменные не синхронизируются, синхронизируются хендлы (объекты)
Старый 26.04.2011, 21:51
ARHUI

offline
Опыт: 3,341
Активность:
а как иначе мне камеру туда переместить? Ей нужен локейшн.
Старый 26.04.2011, 22:09
Ответ

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

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

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

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



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