Реализация автоматического удаления ненужных переменных
Привет всем. Не уверен, была ли тема, где люди делились своими наработками и хитростями в реализации чего-либо… Вроде что-то такое было, но ни ручным поиском, ни через форму поиска, ничего похожего я не нашел…
В общем, нанчу с лирики:
За основу идеи я взял суть локальных переменных, которые появились в версии 5.8.0 классического плеера, которые “живут” в пределах одного блока кода, и после того, как этот блок кода выполнится, локальные переменные, которые в нем содержались, автоматически уничтожаются. То есть, нам не нужно заботиться об уничтожении таких переменных, но есть ситуации, когда нужна временная “глобальная” переменная, которая во время выполнения может появиться в любой момент, и которая неким образом влияет на события и действия вызываемых локаций через gt и gs. В таком случае задача контроля “жизни” переменных такого типа ложится на наши плечи, из соображений оптимизации. И это действительно становится проблемой, когда игра становится большой. За всем не уследишь, но очень хотелось бы.
Что делать? На помощь нам приходит сам QSP, который позволит нам автоматически уничтожать ненужные переменные, независимо от версии плеера.
Реализация:
Суть проста - мы используем служебную локацию как триггер, который нам позволит своевременно уничтожать ненужные переменные.
# Ваша главная локация
!Назначаем обработчик перехода на новую локацию
$onnewloc = 'onnewloc'
# Локация-обработчик “onnewloc”
Проходим в цикле по массиву “killvars” и уничтожаем все переменные, которые мы туда добавили:
Вариант для версии 5.8.0 классического плеера:
Spoiler
loop local i = arrsize('killvars') while i > 0 step i -= 1:
killvar $killvars[i - 1]
end
killvar 'killvars'
Вариант для версии плеера ниже 5.8.0:
Spoiler
i = arrsize('killvars')
:loop
if i > 0:
killvar $killvars[i - 1]
i -= 1
jump 'loop'
end
killvar 'killvars'
killvar 'i'
# Код в любом месте вашей игры
Динамически добавляем имена переменных в массив $killvars:
$killvars[] = 'имя_переменной_для_уничтожения'
Таким образом, мы динамически создаем массив ненужных нам в будущем переменных $killvars, которые будут уничтожены при следующем выполнении локации-обработчика “onnewloc”. Иными словами, это те же локальные переменные, но “живут” они уже не в пределах одного блока, а в пределах одной локации (точнее, до следующего вызова локации-обработчика). Проще простого. Такой способ для плеера версии ниже 5.8.0 можно считать некой реализацией локальных переменных.
Разумеется, вы можете взять идею реализации за основу, и сделать ее по-другому, без использования локации-обработчика.
За сим все. Надеюсь, кому-то будет полезным.
P.S.
На правах первонаха, нарекаю данный костыль “ленивыми локальными переменными” :D