Инфо: Карта на актуальном патче Reforged. Триггеры на GUI, по немногу переписываю на Jass. Весь код не имеет сложных расчетов и манипуляций, карта в стиле altered melee.
  1. В процессе игры по сети возникает рассинхрон и участников игры выкидывает из игры. Как много утечности в триггерах на GUI, на что обращать внимание в первую очередь при подобной проблеме. Чего нужно избегать в будущем?
  1. Про утечки в Warcraft почитал, переводя код в jass привожу по возможности к нативкам, без вызова функций в функции. Еще в локалках подчищаю объекты, так как они при выходе из функции все равно остаются в памяти (по 4 кб на каждый объект). Есть ли ещё что-то что нужно учесть и я упустил?
  1. Глобалки - говорится что это Зло. Но каким образом хранить доп переменные которые хранят информацию всю игру? (для актуального патча Reforged).
  1. Немного поздно переходить на LUA, но все-таки, если дать заднюю и переписать на LUA, будет ли это на порядок эффективнее и производительнее? или лучше уже не дергаться?

Думаю, если есть возможность перейти на луа по дефолту, хуже не будет, и пункты 1 и 2 уйдут сами собой )
По п 3 - глобалки разве что для удобства нужны, как константы, чтобы избежать "магических чисел", например, и для переноса каких либо общих данных между функциями, вроде каллбека таймера итп. И массивы для бд подойдут, в сочетании с циклами. Для частого переноса данных или использования вместо локалок - глобалки зло, да. )
`
ОЖИДАНИЕ РЕКЛАМЫ...
29
Немного поздно переходить на LUA
Жто же так сложно.

Глобалки - говорится что это Зло.
Нативки тоже глобальны, так что не используй их.
Загруженные файлы
13
Нативки тоже глобальны, так что не используй их
Какая альтернатива?
Ответы (4)
13
nazarpunk, является ли Lua гарантом защиты от рассинхрона в сетевой игре?
29
AMark, ничто не гарантирует отсутствие рассинхрона. Так что нужно считать вероятности, которые на lua меньше при наличии умения думать через мозг.
21
Думаю, если есть возможность перейти на луа по дефолту, хуже не будет, и пункты 1 и 2 уйдут сами собой )
По п 3 - глобалки разве что для удобства нужны, как константы, чтобы избежать "магических чисел", например, и для переноса каких либо общих данных между функциями, вроде каллбека таймера итп. И массивы для бд подойдут, в сочетании с циклами. Для частого переноса данных или использования вместо локалок - глобалки зло, да. )
Принятый ответ
Ответы (39)
13
EugeAl, спасибо. Поизучаю Lua на досуге. Меня только смущает одно. Lua в WarCraft 3 полноценный, никаких ограничений нет?
29
Для частого переноса данных или использования вместо локалок - глобалки зло, да.
И ты можешь это доказать? Или по традиции вбрасываешь?
29
Lua в WarCraft 3 полноценный, никаких ограничений нет?
require не работает и fs по понятным причинам отключено.
21
nazarpunk, конечно, могу. К примеру, тот же таймер, где в каллбек подаются данные из глобалки, и притом таймер не один, а глобалка одна. Очевидно, что данные могут быть туда перезаписаны не 1 раз и будет подано не то значение.
Пример 2 - get trigger unit записывается в глобалку, а потом глобалка используется после вейта, триггер срабатывает не 1 раз. Очевидно, что данные..., ну ты понял.
будешь провоцировать и хамить - буду на тебя сразу жалобы в админку кидать, без лишних слов
28
EugeAl, ты говоришь за частоту использования данных, а не какой-либо интервал между записью и использованием*. Вар однопоточен, пока не выполнится предыдущее действие следующее не начнётся, поэтом если грамотно использовать глобалки для темповых действий - никакого зла
29
К примеру, тот же таймер, где в каллбек подаются данные из глобалки, и притом таймер не один, а глобалка одна. Очевидно, что данные могут быть туда перезаписаны не 1 раз и будет подано не то значение.
Почему собственную рукожопость ты выдаёшь за недостаток глобалок?
а потом глобалка используется после вейта
Если ты используешь вэйты, то сам себе злобный Буратина, глобалки здесь при чём?
13
nazarpunk, у всех разный уровень, у каждого свой подход. Тут собрались мапмейкеры разного уровня, кто на гуях, а кто-то может свободно творит на Lua с учетом ООП и всех SOLID, DRY, KISS принципов. Все молодцы, на благо комьюнити трудимся и в споре ищем истину. Вопрос уже закрыт, точку зрения я понял, изучил, Lua топчик для Reforged, перескочить на него не проблема, добавлю в список задач проекта, позже выделю время для конвертации и рефакторинга. А пока что просто "пожар" починю.
29
у всех разный уровень, у каждого свой подход.
И это никак не значит, что можно втирать лютую дичь про то что глобалки это зло. А ты даже этот ответ лучшим выбрал. Так держать, пускай нагуглившие этот вопрос приобщаются к прекрасному и продолжают нести охинею в массы.
28
EugeAl, если ты это и имел ввиду, то почему глобалки зло?
29
rsfghd, ну я собственно это и имел ввиду
То есть глобалки это зло потому что ты рукожоп?
1 пункт от ScorpioT1000: 2.2 Провокация других пользователей на нарушение правил.
21
rsfghd, Да не говорил я, что они прямо зло. Просто их не надо использовать, где они могут вызвать проблемы и наложение данных. Например, в гуи вместо локалок или для работы с вейтами и таймерами. (Исключая ситуации, где под каждый вейт или таймер своя глобалка)
Для частого переноса данных или использования вместо локалок - глобалки зло, да. )
А не вообще. Частый перенос данных - имелась ввиду ситуация, к примеру, когда триггер реагирует на событие смерти юнита, и в его коде в глобалку сохраняются данные, а потом через вейт используются. Тогда будет наложение, ведь триггер сработает много раз.
П. С. Не знаю других способов, как без вейта или таймера сделать отложенные действия, когда это нужно. Не писать же мозголомные системы
21
rsfghd, замечательно, а на джассе обычном как?
И Вар многопоточен, так то. Пусть и не совсем
21
nazarpunk, А на тебя, друг любезный, я уже 2 жалобы в админку кинул, ибо задрал хамить. Научись вежливости, и тогда будем разговаривать
21
rsfghd, а, ну да, кстати, забыл про него ) спасибо)
Правда, у него есть недостаток - если имеется в виду время суток - оно может течь по разному, если в игровых константах настроить другую длительность суток.
38
EugeAl, я бы рекомендовал почитать статьи, прежде чем пытаться отвечать на вопросы, в итоге создавая бардак и дезинформацию
21
ScorpioT1000, ок. В следующие разы буду добавлять ссылки на статьи при ответах.
28
И Вар многопоточен, так то
не могут выполнить что-то в один и тот же момент времени физически
rsfghd
пока не выполнится предыдущее действие следующее не начнётся,
28
EugeAl, в дисклеймере отправленной тобой статьи указано ещё одно утонение, которое через запятую описано и у меня, зачем ты мне это скинул
28
EugeAl, недостаток игрового времени легко регулируется арифметической логикой)
21
несколько потоков jass
Однако, когда срабатывает событие, например, "Юнит атакован", запускается новый поток.
Лучше можно рассмотреть на рисунке - сверху вниз показано, какие потоки отрабатывают в какой момент времени.
каждая отработка события триггера запускает новый jass-поток, который работает почти независимо от остальных.
Статью скинул как пруф своих слов о многопоточности.
28
EugeAl,
rsfghd
пока не выполнится предыдущее действие следующее не начнётся
Неважно какой поток и где, все они обрабатываются как один, по порядку
28
EugeAl,
Красным справа показано, что таймер порождает всё новые и новые потоки, несмотря на то, что процессор не успел отработать предыдущий
Выделенное тебе же говорит о чем-то?
28
EugeAl, скажу проще, чтобы ты не давил своей позицией - ты приплел псевдопотоки не относящиеся к моему изначальному сообщению на эту тему, где я же и указал, почему вар однопоточен
21
Неважно какой поток и где, все они обрабатываются как один, по порядку
Если бы так было, тогда бы оно работало так, как нарисовано на картинке справа. И каждый TriggerSleepAction задерживал бы всё последующее исполнение кода. Но подобного не происходит.
А вообще, неплохо было бы получить от тебя ссылку на статью, где доказано, что Вар однопоточный.
Загруженные файлы
28
А вообще, неплохо было бы получить от тебя ссылку на статью, где доказано, что Вар однопоточный.
Ты сам её и скинул же.. боже мой блат, короче разбирайся самостоятельно. Ты в своей ноосфере сидишь, я в своей. Не пытайся пропихнуть свой пузырь в мой - лопнешь
29
А вообще, неплохо было бы получить от тебя ссылку на статью, где доказано, что Вар однопоточный.
Когда покажешь гонку в жассе, тогда и поговорим.
38
EugeAl, ты не усвоил самое главное в этой статье
Загруженные файлы
38
EugeAl, пообщались с анрайзом, обновил информацию в статье
21
ScorpioT1000, Спасибо за обновление статьи. Хорошо, что написали про ветки действий. Тут уже совсем другое дело.
29
Тут уже совсем другое дело.
Настолько другое, что JASS внезапно стал однопоточным?
21
nazarpunk, кстати таки нет, ведь
Функции ExecuteFunc, Preload и .ai скрипты стартуют свои потоки и их выполнение происходит в отдельном стеке. В случае с preload и .ai даже в отдельном глобальном контексте.
И не jass, а Вар, но это выходит за рамки обсуждения, на чём можно и поставить точку
38
Jassvm-многопоточность в одном ос-потоке)
21
ScorpioT1000, У меня тогда возник вопрос, не связанный с jass. А Вар сам по себе многопоточен? Например, рендеринг моделей, обработка анимаций, свет, обработка звуков, поиск данных по slk итд - идут в том же потоке, что и обработка игрой jass скрипта, или в других?
38
EugeAl, там вроде как один единственный, а вот в рефордже графику вывели в отдельный движок с современными фишками
Что касается звука - там дается на откуп звуковым апи, они сами умеют контролировать воспроизведение и совершать прерывания.
21
ScorpioT1000, Ну да, похоже на то, если считать потоком обработку всего этого только одним ядром CPU, как в статье написали.
38
Случайно не используешь z координату? В рефордже окончательно похоронили третью координату в мультиплеере - она отличается на разных настройках графики, даже если это не sd, а там тем более
Ответы (6)
13
ScorpioT1000, я нашел список рассинхрона. Z-координату не использую. Похоже на:
a. GetLocalPlayer() used for anything else than UI-display or sound-play, or used by Blizzard internal functions (search GetLocalPlayer here to get them). Here is a FAQ on how to use it properly.​
b. GUI Function "Select unit group <group> for player <player>", alias JASS function SelectGroupForPlayerBJ. You should replace it by a for loop that adds unit 1 by 1 to selection (source: here).​
Одно из этого, пересмотрю код
38
AMark, я думал, используют GetLocalPlayer когда уже работают с асинхронным кодом, а не наоборот - берут рандомную нативку и потом разбираются, зачем она существует)
13
ScorpioT1000, может я неправильно что-то пишу, но суть моего ответа в том, что я не знаю заранее, что скрыто при парсинге GUI в JASS. При конверте кода я смотрю используется ли GetLocalPlayer (вероятность же есть), а также слежу за GUI функцией "Select unit group <group> for player <player>", вероятно что я прогорел на этой функции, у меня есть отлов групп, которым я отдаю приказы через область. Я не беру рандомные нативки, я решаю конкретные задачи.
Ваш совет тоже имеет смылс, это тоже проблема вызывающая рассинхрон. Но конкретно в моем случае я уверен что никогда не работал с Z координатами.
38
AMark, дело в том, что эта нативка не юзается из gui (кроме редких случаев в blizzard.j), об нее нельзя случайно споткнуться
13
Зашкаливающее количество постиронии
Коротко обо всем в данном посте:
"Типичный" завсегдатай Хигамы:
Уважаемые начинающие мапмейкеры Warcraft! Сегодня я хочу рассказать, как легко и просто можно начать разрабатывать карты для этой легендарной игры. Не пугайтесь, всё очень базово. Для начала вам нужно всего лишь выучить всё о механике игры. Да-да, не только способности героев, а все юниты, апгрейды, каждую мелочь. Ведь как вы планируете что-то разрабатывать, не зная, как правильно считать урон виверны или почему при определённых действиях игра решает выйти из строя? Ну и, конечно, база данных игры — все способности, характеристики, юниты и их взаимодействия. Вам нужно знать это как таблицу умножения, это же основы!
Но это лишь начало. Следующий шаг на пути к разработке карт — это переход к высокоуровневому программированию. Подумаешь, пару языков вроде Jass, Lua, Python и C++ освоить! Вам же нужно сразу же погрузиться в парадигмы программирования: объектно-ориентированное, функциональное, логическое. Вы должны понять их все! Но не останавливайтесь, нет! Далее вас ждёт низкоуровневое программирование. Байт-коды, ассемблер — разве вы планируете разрабатывать карты, не зная, как ваш код будет взаимодействовать с видеокартой и оперативной памятью?
Но и это — цветочки. Давайте двинемся дальше. Теперь пора изучить, как происходит парсинг кода и его преобразование в двоичный формат. Ну и, конечно, освоить обратный инжиниринг: чтобы без труда разобрать Warcraft на молекулы, а потом собрать его снова. Это ведь обычное дело для мапмейкера, правда?
Когда вы с этим разберётесь, можете переходить к более «сложным» вещам — изучению клиент-серверного взаимодействия. Чтобы ваша карта работала идеально, вам нужно вникнуть в работу сетевых приложений и, конечно, разработать собственный сетевой протокол. Ведь ваша карта должна быть серьёзной заявкой!
И вот на этом этапе у вас уже должно быть как минимум PhD в области программирования. Ну, или хотя бы магистратура. И не забудьте создать собственный фреймворк, который будет использоваться миллионом людей по всему миру! Ведь это важный шаг перед тем, как заняться разработкой карт.
И вот, когда все эти базовые вещи у вас за плечами, можно наконец-то заняться тем, ради чего вы сюда пришли — БЕСПЛАТНОЙ разработкой карт для Warcraft! Просто ради души. Разве не ради этого мы все тут?
Ну что ж, удачи вам на этом простом и увлекательном пути, друзья!
замечание от Maxlaid: 4.1.2 Размещение комментариев, не имеющих отношения к обсуждению (оффтопик). Хорошая конечно речь, но за тему вопроса не уходите.
Ответы (2)
21
AMark, В статье забыли очень важную вещь написать - "Также вы обязательно должны выучить всё, что связано с графикой игры, как минимум с моделями, а также научиться делать модели, освоить работу с анимациями, а в идеале ещё и освоить фотошоп и научиться рисовать текстуры. Ведь карта должна отличаться от остальных!"
29
AMark, я так понимаю, ты хочешь ничего не учить и что-то делать?
28
AMark, мда, горе советчик. Как можно было забыть про высшую математику, мета и квантовую физики? Философские учения, аксиологии, мировую литературу до начала нашей эры? Пещерные иероглифы? Как без всего этого придумать сюжет для карты? Смешной
Ответы (1)
22
rsfghd, изучение Артеса по крупитсам важно, Артесы на все времена!
Чтобы оставить комментарий, пожалуйста, войдите на сайт.