Как уменьшить лаги.
Вы наверняка часто сталкивались с жалобами игроков на лагающую карту или же у вас подвисает карта во время игры? Эта статья расскаже вам об источниках лагов и как убрать эти лаги.
1. Лаги при инициализации карты. Это может быть долгое время загрузки или же лаги сразу же после старта игры. Есть несколько причин этих лагов:
А. Создание войск и героев.
Каждый раз когда вы создаёте воина или героя во время загрузки карты, создание занимает некоторое время. Если поместить это создание в инициализацию карты, то можно избавиться от внутриигровых пауз, но карта будет загружаться дольше. Если вы хотите избежать таких лагов, то поместите небольшой ролик перед игрой. Тогда игроки не заметят внутриигровых пауз или большого времени загрузки.
Б. Массивное количество кода.
Если при инициализации карты выполняется много кода, то это может значительно замедлить загрузку карты. Выполнив некоторую часть этого кода во время ролика в начале игры может сделать процесс более быстрым.
В. Загрузка карты.
Другие игроки могут лагать из-за размера вашей карты. Если размер вашей карты Большой или Огромный, то можно добавить время загрузки сразу после старта игры, тогда игроки смогут выдержать мощный поток на их компьютерах. (Подобное я видел в Vengeance RPG)
2. Лаги во время игры. Во время игры ваша карта лагает всё больше? Этому может быть несколько причин:
А. Утечки памяти.
Знаете ли вы, что каждый раз, используя "Pick every Unit in..." или "Create Units at Location", вы создаёте утечку памяти? Это основная причина лагов во время игры. Многие переменные вызывают утечки, например: точки, отряды, группы игроков, спецэффекты, молнии, плавающие тексты, таймеры и.т.д.
Чтобы обойти эти утечки стороной, занесите утечный тип в переменную, затем используйте строки Custom Script(Jass), чтобы избавиться от утечки.
Первый шаг - определить типы всех значений, которые вы можете изменить. В этом триггере я использовал 1 (Целочисленная), Пехотинец (Тип боевой единицы), Игрок 1 (Красный) (Игрок), Position of(Entering unit) (Точка), Entering unit (Боевая единица) и Стандартная ориентация зданий (Реальная).
Следующий шаг - определить, какие типы переменных утечны.
1 (Целочисленная) = Целочисленные не вызывают утечек.
Footman (Тип боевой единицы) = Типы боевой единицы не вызывают утечек
Player 1 (Red) (Игрок) = Игроки не вызывают утечек
Position of (Entering unit) (Точка)= Точки ВЫЗЫВАЮТ УТЕЧКИ.
Entering unit (Unit)= Войска не вызывают утечек
Default buliding facing degrees (Real) = Реальные не вызывают утечек
Как можно увидеть выше, я нашёл переменную, которая вызывает утечки, моя переменная-точка.
Итак, нам нужно занести во временную переменную эту точку ПЕРЕД созданием воина, затем использовать эту переменную в создании воина.
Теперь утечка записана в переменной и можно её удалить. Каждая утечная переменная имеет действие уничтожения, запомните эти линии:
Custom script: call RemoveLocation (udg_*Temp variable name here*)
Custom script: call DestroyGroup (udg_*Temp variable name here*)
Custom script: call DestroyForce (udg_*Temp variable name here*)
Custom script: call DestroyEffect (udg_*Temp variable name here*)
Custom script: call DestroyLightning (udg_*Temp variable name here*)
Custom script: call DestroyTextTag (udg_*Temp variable name here*)
Custom script: call DestroyTimer (udg_*Temp variable name here*)
Для спецэффектов Blizzard уже создала триггерное уничтожение:
Special Effect - Destroy (Last created special effect)
Вы должны следить за хитрыми утечками, например двойные точки.
Может показаться, что здесь одна единственная утечка. Но это не так. Их две - Position of (Entering unit) вызывает утечку, но также создаёт точку в дистанции от себя, а эта точка тоже вызовет утечку. Нужно позаботиться о двух точках.
Ещё один тип переменной, который вызывает утечки - область, но она вызывает утечки только в том случае, если это не область по умолчанию (Playable Map Area) или уже поставленная на карте область (Region XXXX <gen>), эти типы утечек не вызывают. Существует линия кода, которая позволяет уничтожить этот вид утечки:
Custom script: call RemoveRect(udg_*Temp variable name here*)
Вот, как выглядит утечная область:
Как вы заметили, это создаёт регион (Всё, что не было сразу поставлено на карту, вызывает утечки), а также ТОЧКУ. Этот лаг убирается так же, как и двойные точки - присвойте отдельную переменную каждой утечной строке и уничтожьте их.
Скорее всего, вы тоже создаёте лаги, если используете локальные переменные, типы которых наследуются от handle.
Если оставить переменной, тип которой наследуется от handle, значение, это вызовет утечку точно так же, как и при неуничтожении. Чтобы это исправить, следует обнулить переменную.
От handle наследуются все типы переменных, кроме boolean, integer, real, и string.
A handle variable includes every single type of variables, except boolean, integer, real, and string. Итак, если у вас есть функции, которые начинаются так:
local VARIABLETYPE NAME
Это создание локальной переменной, и если это не integer, real, string, или boolean, то её нужно обнулить следующим образов:
set NAME = null
Однако, есть несколько исключений:
- Если вы не хотите навсегда очистить локальную переменную, то нет смысла её обнулять. Например, триггеры почти никогда не уничтожают.
- Игроки - это второе исключение из правила, они утечек не вызывают, их нельзя уничтожить, соответственно, можно их не обнулять.
В. Триггерные способности.
Это в основном последняя причина лагов, т.к. большинство лагов может быть исправлено путём удаления утечек. Однако, есть и исключения:
- Лаги могут быть не только из-за утечек, но и из-за вызванных триггерами способностей.
- Если способность использует триггер с периодическим событием, у которого маленькое значение (0.05 и ниже), это может спросоцировать лаги.
Ниже даю вам советы, чтобы сделать вашу карту как можно менее лагающей.
• Избегайте периодических событий настолько часто, насколько это возможно. Если не нужно его использовать, то не используйте его.
• Используйте способности с периодическим событием только для войск, которых мало на карте, например для героев.
• Попробуйте перевести способность в код и оптимизировать её.
• Избегайте большого количества спецэффектов, используйте юнитов-дамми как замену.
• Используйте ненамного большое время при периодическом событии, лучше использовать интервал 0.03-0.05, чем 0.02-0.01. Человеческий глаз разницы не видит.
Г. Большое кол-во объектов.
Попробуйте уменьшить кол-во войск, декораций и спецэффектов на карте. Вместо того, чтобы ставить сотни воинов, обойдитесь парой сотен. Спецэффекты замените на дамми, так вы облегчите графическое ядро.