Помощь - Поиск - Пользователи - Календарь
Полная версия: UOpilot поедает оперативную память
UoKit.com Форумы > Кликер > UO Pilot
фонарик
Подскажите в чем может быть проблема, и проблема ли это вовсе. Работают параллельно 5 одинаковых скриптов. Проверяют пиксели, жмакают мышку, клавиатуру. Проверяют положение активного окна. Иногда чтото печатают. Периодически делают скриншоты привязанного окна. Регулярно показывают подсказку, что скрипт в данный момент себе думает/делает.

Спустя примерно часа такой деятельности, UOpilot увеличивает кол-во занимаемой ОЗУ компьютера на 50мб. Спустя примерно полтора суток, когда порог приближается к 2гб, перестают работать некоторые команды и функции (не делаются скрины, не читается цвет пикселей).

Как с этим бороться? Что такое важное в таком размере пилот начинает хранить в памяти? Можно ли как-то сбросить у него из мозгов этот хлам? Каккие команды его так напрягают? Подскажите пожалуйста кто что знает.
DarkMaster
Кандидат номер один на данную проблему getimage, при условии, что вы не освобождаете память после того, как изображение более не требуется. Примерно та же проблема может произойти, если вы постоянно собираете что-то в массив с новыми индексами либо создаете новые массивы.
фонарик
Да, GetImage используется часто и конечно же, из памяти я ничего не удаляю ибо считал, что оно по типу переменной - просто переписывается. Попробую удалять из памяти и посмотреть, что получится. Спасибо Вам за совет, DarkMaster.
DarkMaster
smile.gif
фонарик
Все верно, DarkMaster, вы как всегда даете очень полезный совет. Добавив строку DeleteImage, память перестала расхищаться из ресурсов компьютера в таких крупных масштабах. За сутки, размер UOpilot в памяти увеличился с 19мб до 190. Это уже на так критично, хватит работы на несколько дней без перегрузки, пока не начнутся перебои.
Fors1k
Цитата(фонарик @ 5.10.2020, 22:35) *
размер UOpilot в памяти увеличился с 19мб до 190.

Добавьте эту строку в ваш скрипт collectgarbage ("collect").
mymerlin
Цитата(Fors1k @ 7.10.2020, 1:45) *

Добавьте эту строку в ваш скрипт collectgarbage ("collect").


Это для Lua или для обычного UO тоже подойдёт? не нашёл ничего про эту функцию в документации
DarkMaster
Это только для луа. Вызов коллектора, как правило, ни к чему не приводит, т.к. он вызывается автоматически виртуальной машиной луа.
Fors1k
Цитата(mymerlin @ 17.10.2020, 12:26) *

Это для Lua или для обычного UO тоже подойдёт? не нашёл ничего про эту функцию в документации

Просто перезаписываем одну и ту же переменную
Код
--lua
log 'clear';log 'mode compact'
-- Создадим файл для теста
require"luaposh";PScode('return',{[[#}
#
[IO.File]::WriteAllLines("C:\files\test.txt",  [Linq.Enumerable]::Repeat("aaaaaaaaaaaa",3000000))
#
]]})
-- Прочитаем файл в переменную
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
-- Второй раз читаем файл в туже переменную без чистки памяти
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
-- Ждем
for i=1, 1000 do wait(2) end
-- Третий раз читаем файл в туже переменную без чистки памяти
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
-- Ждем
for i=1, 1000 do wait(2) end
-- Смотрим результат
memUsed = math.modf(collectgarbage ("count"))
log("занято памяти : "..memUsed)
занято памяти : 103708

Используем collectgarbage
Код
--lua
log 'clear';log 'mode compact'
-- Создадим файл для теста
require"luaposh";PScode('return',{[[#}
#
[IO.File]::WriteAllLines("C:\files\test.txt",  [Linq.Enumerable]::Repeat("aaaaaaaaaaaa",3000000))
#
]]})
-- Прочитаем файл в переменную
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
-- Второй раз читаем файл в туже переменную и чистим память
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
collectgarbage ("collect")
-- Ждем
for i=1, 1000 do wait(2) end
-- Третий раз читаем файл в туже переменную и чистим память
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
collectgarbage ("collect")
-- Ждем
for i=1, 1000 do wait(2) end
-- Смотрим результат
memUsed = math.modf(collectgarbage ("count"))
log("занято памяти : "..memUsed)
занято памяти : 54554


Разница 49мб
DarkMaster
Цитата
Разница 49мб

Цитата
как правило, ни к чему не приводит

Сборщик мусора вызывается в определенном соотношении к операциям выделения памяти. Т.е. грубо говоря обожравшаяся программа со временем похудеет, если этот хлам уже не нужен. Поэтому КАК ПРАВИЛО, но не всегда. Для "особых" случаев ручной вызов и есть.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.