Эта тема предназначена исключительно для тех, кто пишет скрипты на RGSS или RGSS2. Остальные едва ли найдут здесь для себя что-либо полезное!
Порой, бывает так, что при написании большого многостраничного скрипта, попутно рождаются маленькие, но очень полезные скриптики, способные упростить, ускорить, оптимизировать работу того или иного скрипта. Обычно, они так и теряются в дебрях кода, а ведь могут и принести реальную пользу многим скриптерам, которые смогут написать при помощи них нечто значительно лучшее, нежели очередная модификация велосипеда!
Ну и, собственно начну...
Наверняка, каждый скриптер рано или поздно утыкался взглядом в метод dispose, имеющийся в каждом окошке мейкера. Лез на умные форумы, где узнавал, что "уборщик мусора" - штука классная, но ненадежная, а потому все свои окошки, спрайты, картинки и прочее очень желательно затирать вручную. И порой, особенно в сложных скриптах, метод dispose превращается в совершенно безумное нагромождение циклов, которые вычищают содержимое массивов, хешей...
Вот и я несколько часов назад столкнулся с подобным скриптом. И так мне это все не понравилось, что я решил написать свой, универсальный, метод для высвобождения памяти из чего угодно... Вот, собственно, и он:
#===============================================================================
#
#===============================================================================
class Object
#-----------------------------------------------------------------------------
# Возвращает true, если у объекта есть метод dispose
#-----------------------------------------------------------------------------
def disposable?
return methods.include?("dispose")
end
#-----------------------------------------------------------------------------
# Освобождает зарезервированную объектом память, если это возможно
# В случае если объект - массив или хэш, будет освобождено все его содержимое
#-----------------------------------------------------------------------------
def free
if is_a?(Array)
each_with_index{ |item, index|
item.free
self[index] = nil
}
clear
elsif is_a?(Hash)
each{ |key, item|
item.free
key.free
self[key] = nil
}
clear
else
if disposable? then dispose else return false end
end
end
#-----------------------------------------------------------------------------
end
Теперь, чтобы освободить любой объект - картинку, спрайт или трехмерный массив с вложенными хэшами и все его содержимое, достаточно вызвать метод "free" и этот крошечный скриптик проделает всю "грязную" работу за вас!
Скрипт писался ночью, в отсутствии кофе, так что может содержать ошибки! Впрочем, я его несколько раз погонял на разных объектах, в том числе и вышеупомянутых многоэтажных массивах - работает!