У меня в карте при старте спустя секунд 10-15 иногда возникает проблема рассинхрона. (официальная версия WC3 - R.)
Но я не использую GetLocalPlayer(),
То, что я прочитал про рассинхрон также мне не помогло, так как я не использую перечисляемые кейсы.
У меня есть одна догадка с чем это может быть связано, но я не знаю как устроено выделение памяти в wc3, так что если кто в курсе - может, подскажет, насколько она вероятна?
В некоторых ситуациях описание абилок, способностей и просто текстовые уведомления составляются при помощи комбинации нескольких строк. Например "Your reward: {0}", где {0} - перечисление название предметов, которые берутся из GetItemName().
А так как игроки играют в варик с разными версиями локализации, то у одних игроков это может быть строка "Your reward: кольцо защиты, пояс великана", а у других "Your reward: Ring of Protection, Giant's Belt".
Может ли быть такое, что под разные строки у разных игроков выделяется разное количество байт, из-за в структуре хранения данных что-то смещается и вызывает рассинхрон?
Просто, если не в этом причина, то я уже ума не могу приложить что этот рассинхрон может вызывать. Причём, это плавающий баг. Иногда целый день играешь во множество разных каток, а сегодня раза 4 пытался создать игру, и после запуска секунд через десять происходит вылет из карты и переход в экран результатов. Перезапуск Wacraft не помогал.

Принятый ответ

Отвечу базируясь на старых (и на деле более стабильных версиях).
Jass String (если ты таки кодишь на GUI или джасс) имеют тройную буферизацию (то бишь данные хранятся в 3ёх разных местах) и каждая новая/уникальная строка получает свою структуру RCString (Jass string), нюанс в том, что чрезмерное изменение строк, может в какой-то момент заменить уже существующую строку (такое случается достаточно редко), но даже так рассинхрона не будет до того момента, пока та или иная строка не будет применена для сравнения и последующего выполнения какого-нибудь кода, допустим:
local string someText = "OriginalText"

if someText == "OriginalText" then

endif
В данном случае someText - хранит в себе число (индекс строки в базе), и если произойдёт перезапись строки, то у одного игрока может прийти другой текст, который отличается от того, что у остальных, в итоге у него действие не выполнится и движок выкинет этого игрока ссылаясь на CTrustedDesync структуру.
В рефорже с этим проблем ещё больше (по крайней мере из рассказов тех, кто там делает карту) и зачастую десинхронизация происходит вообще из-за малюсенького разрыва связи (как в старые-добрые бородатые времена), потому тут сложно дать 100% причину, из-за чего может быть проблема.
И конечно же другой нюанс - это лимит в 1024 байт на джасс текст, где русские символы занимают 2 байта, что тоже может вызвать проблему.
TL;DR:
Прямой ответ получить сложно, а твой последний вопрос скорее всего связан с тем, что либо у тебя интернет отваливался или в Battle.net были проблемы. Ожидай ответ от кого-нибудь ещё, авось найдётся кто-то со схожей проблемой.
`
ОЖИДАНИЕ РЕКЛАМЫ...
3
20
1 год назад
3
Отвечу базируясь на старых (и на деле более стабильных версиях).
Jass String (если ты таки кодишь на GUI или джасс) имеют тройную буферизацию (то бишь данные хранятся в 3ёх разных местах) и каждая новая/уникальная строка получает свою структуру RCString (Jass string), нюанс в том, что чрезмерное изменение строк, может в какой-то момент заменить уже существующую строку (такое случается достаточно редко), но даже так рассинхрона не будет до того момента, пока та или иная строка не будет применена для сравнения и последующего выполнения какого-нибудь кода, допустим:
local string someText = "OriginalText"

if someText == "OriginalText" then

endif
В данном случае someText - хранит в себе число (индекс строки в базе), и если произойдёт перезапись строки, то у одного игрока может прийти другой текст, который отличается от того, что у остальных, в итоге у него действие не выполнится и движок выкинет этого игрока ссылаясь на CTrustedDesync структуру.
В рефорже с этим проблем ещё больше (по крайней мере из рассказов тех, кто там делает карту) и зачастую десинхронизация происходит вообще из-за малюсенького разрыва связи (как в старые-добрые бородатые времена), потому тут сложно дать 100% причину, из-за чего может быть проблема.
И конечно же другой нюанс - это лимит в 1024 байт на джасс текст, где русские символы занимают 2 байта, что тоже может вызвать проблему.
TL;DR:
Прямой ответ получить сложно, а твой последний вопрос скорее всего связан с тем, что либо у тебя интернет отваливался или в Battle.net были проблемы. Ожидай ответ от кого-нибудь ещё, авось найдётся кто-то со схожей проблемой.
Принятый ответ
1
17
1 год назад
1
Имхо, лучше избегай сравнения и использования строк в качестве данных, лучше используй для этого равкоды или числовые/handle данные в массивах/хеш таблице, чтобы точно перестраховаться и не думать о проблемах локализации. Особенно если баги плавающие, тяжело их потом ловить будет.
0
13
1 год назад
0
Отвечу базируясь на старых (и на деле более стабильных версиях).
Ого, спасибо большое за такой развёрнутый и информативный ответ. Очень приятно было его получить. Но нет, я строковых сравнений никаких не делал. У меня в подсознании стоит запрет на использование строк в таком ключе, особенно с учётом локализации. Значит остаётся считать, что у меня просто были проблемы с интернетом.

Имхо, лучше избегай сравнения и использования строк в качестве данны
Я не использовал строки для сравнения и в качестве данных -) Я их только устанавливал для отображения на экране либо в качестве описания абилок/предметов/имён юнитов.
1
17
1 год назад
1
Значит остаётся считать, что у меня просто были проблемы с интернетом.
И проблема с версией видимо тоже. Мб там близы ещё что нибудь сломали в строках и данных.
1
20
1 год назад
1
"либо в качестве описания абилок/предметов/имён юнитов."
Замену делал через установку поля? Если да, то есть шанс что с этим и связано. Но это 100% не связано с вылетом после загрузки, ибо игра ещё не успела даже ничего подгрузить.
2
13
1 год назад
2
Замену делал через установку поля?
Да, через установку поля.
Если да, то есть шанс что с этим и связано. Но это 100% не связано с вылетом после загрузки, ибо игра ещё не успела даже ничего подгрузить.
Вылетает не сразу после загрузки, а секунд через 10-20
Я видел, что игрок, который каждый раз пытался подключиться к создаваемой мною игре, потом сделал свою игру на основе этой же карты. Когда я спросил стабильно ли остальные подключились и нормально ли они поиграли, он подтвердил. Значит, скорее всего, это какие-то мои локальные проблемы. Вероятно, что-то не так с качеством подключения.
Но твой ответ всё равно был очень полезен, мне информация о принципах работы текстов очень помогла, в плане того, что я теперь буду знать на что тексты точно не влияют.
0
3
1 год назад
0
GetLocalPlayer вроде бы починили и он более не диссинхронит, ну только если совсем тупо его использовать. От версии рефорджа зависит, не помню точно, в каком патче его поправили, на 1.32.10 все ок. В плане локализации тут да. Карты рефорджа в мультиплеере часто вылетали, если в матче были игроки с разной локализацией и это до сих пор полностью не починили. Попробуй делать локализацию через fdf файлы и GetLocalizedString. В таком случае код всегда будет одинаковый, а подгружаемая строка будет выполняться уже на локальном клиенте. В теории может исправить ситуацию, на практике хз, не сталкивался с таким еще.
0
13
1 год назад
0
GetLocalPlayer вроде бы починили и он более не диссинхронит
А что именно стало возможно делать при помощи "починенной" GetLocalPlayer ?
0
26
10 месяцев назад
0
а, так у тебя уже были десинки, кекв. и зашла даже речь за строки. ляяя. только почему то в моей карте, где локализация под 2 языка ноль десинков :)
ну, как я писал уже - устанешь биться об стену из-за своего упрямства - напишешь
0
13
10 месяцев назад
0
а, так у тебя уже были десинки, кекв. и зашла даже речь за строки. ляяя. только почему то в моей карте, где локализация под 2 языка ноль десинков :)
ну, как я писал уже - устанешь биться об стену из-за своего упрямства - напишешь
хватит балаболить, мы только что проверяли - не вызывают паирсы десинки. Учи матчасть. Мапы сортируют информацию по байтам, для того, чтобы был ускоренный доступ к данным. Это значит, что для всех игроков ключи имеют одинаковые последствия.
Мало того, что ты говоришь то, о чём не знаешь, так ещё и выкапыаешь мои старые темы, клоун.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.