MasterGH Опубликовано 26 февраля, 2018 Поделиться Опубликовано 26 февраля, 2018 Тема CE Lua скриптов очень интересная. Жаль у меня мало свободного времени на эксперименты с таблицами на формах на CE Lua. 22 часа назад, Razi сказал: В визуальном плане в конструкторе форм получается все довольно неплохо. Выглядит нормально. Думал будет намного хуже. Есть еще вариант написать модуль dll на Лазаре с таблицей. Работать с модулем через Cheat Engine На Лазаре можно делать вот такие красивые таблички. Форму в модуль сохранить и работать с функциями модуля. Но проблема с оптимизацией таким способом может не решаться. 22 часа назад, Razi сказал: Но есть одна проблема. Через час после включения трейнер жрет 700 мб памяти и загружает процессор до 50%. (И с каждой секундой поглощение памяти увеличивается на 3 мб). Может можно что-то сделать, как-то оптимизировать код? Код написан в версии CE 6.5, может в версии 6.7 такого уже нет? В общем посоветуйте, что можно сделать? Если конечно можно. 1. Чистить кеш памяти. Я писал об этом в блоге. 2. Избегать постоянной записи в edit, если этого не требуется. Например кешировать значение в edit-е в переменной Lua, если это значение отличается, то только тогда обращаться к edit. Т.е. не так local addr = addr + 0x84*6 UDF1["CEEdit"..x].Text = readBytes(addr+(x-15*6)) А например так local value = readBytes(addr+(x-15*6)) if table_Cash[i].cash == value then table_Cash[i].cash = value table_Cash[i].edit.Text = value end И тут не используем конструкцию вида UDF1["CEEdit"..x], т.к. скорее всего это как раз увеличивает объемы мусора и нагрузку на его чистку. Т.е. сделать table_Cash = {} и запись разовую сделать по циклу для всех Edit-ов. Как оптимизировать Lua код? Сравнивать его выполнение по скорости и объему мусора. Сравнение по скорости я писал в блоге, а сравнить кеш мусора до и после можно добавить. print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) Вообще, это конечно CE Lua — это такие заморочки. Даже мне неловко предлагать эти решения. Проще на том же Лазаре таблицу сделать, да чтение памяти и запись. И exe скорее всего будет меньше по размеру и таблички красивее 1 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Razi Опубликовано 26 февраля, 2018 Автор Поделиться Опубликовано 26 февраля, 2018 Пробовал на версии 6.7, такой же результат, ест столько же памяти. 6 часов назад, MasterGH сказал: Есть еще вариант написать модуль dll на Лазаре с таблицей. Работать с модулем через Cheat Engine На Лазаре можно делать вот такие красивые таблички. Форму в модуль сохранить и работать с функциями модуля. Ну если не смогу на CE Lua сделать адекватный трейнер, тогда можно будет смотреть на другие варианты. Таблички или editbox неважно. Главное чтоб трейнер работал, а как он будет выглядеть, не главное. Это 1-ый трейнер, который пытаюсь сделать. 6 часов назад, MasterGH сказал: Чистить кеш памяти. Я писал об этом в блоге. Делал это, помогает. Но что будет через 3-5 часов работы трейнера, не проверял, проверялось только час, не больше. А трейнер нужно чтоб работал по 10-15 часов. Если прохождение игры занимает 70-180 часов. И нужно чтоб трейнер был включен все это время, хотя бы часов 100-150. 6 часов назад, MasterGH сказал: Избегать постоянной записи в edit, если этого не требуется. А вот это надо попробовать. Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 27 февраля, 2018 Поделиться Опубликовано 27 февраля, 2018 (изменено) В 26.02.2018 в 15:36, MasterGH сказал: table_Cash[i].edit.Text = value Не очень понял эту конструкцию А точнее что должно лежать в table_Cash? К примеру там будет лежать local table_Cash = { UDF1.CEEdit1, .. } но тогда table_Cash[i].edit.Text = value будет ругаться на "edit". Изменено 27 февраля, 2018 пользователем ReWanet Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 27 февраля, 2018 Поделиться Опубликовано 27 февраля, 2018 1 час назад, ReWanet сказал: Не очень понял эту конструкцию Сначала предварительно создается и заполняется таблица edit-ами. А потом с ними уже работаем Спойлер function CreateTable(form) tableEdits = {} for i=1,5 do tableEdits[i] = {} local edit = createEdit(UDF1) tableEdits[i].edit = edit tableEdits[i].lastText = edit.Text edit.Top = 20 + i * edit.Height + 2 edit.Left = 10 end return tableEdits end local cashTable = CreateTable(UDF1) cashTable[1].edit.Text = 'ReWanet' Спойлер Забыл, еще форму создать либо кодом, либо через инспектор 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 27 февраля, 2018 Поделиться Опубликовано 27 февраля, 2018 (изменено) 39 минут назад, MasterGH сказал: Сначала предварительно создается и заполняется таблица edit-ами. А потом с ними уже работаем Ну то есть все же я правильно понял ( код ниже в том же сообщение )? local table_Cash = { UDF1.CEEdit1, .. } Или же есть какая-то разница в заполнение? ( конечно это лишь пример заполнить можно и через цикл а не руками ) Изменено 27 февраля, 2018 пользователем ReWanet Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 27 февраля, 2018 Поделиться Опубликовано 27 февраля, 2018 13 минут назад, ReWanet сказал: Или же есть какая-то разница в заполнение? Я могу тебе предложить узнать это. Я не знаю ) Проверять надо, в том числе на синтаксис, на скорость выполнения и на мусор в памяти. Тогда можно найти лучший вариант или выбрать любой 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 27 февраля, 2018 Поделиться Опубликовано 27 февраля, 2018 1 минуту назад, MasterGH сказал: Я могу тебе предложить узнать это. Я не знаю ) Ну пойду тогда узнаю ) Если что в комментарий этот же ответ напишу думаю ТС будет интересно. Ссылка на комментарий Поделиться на другие сайты Поделиться
srg91 Опубликовано 27 февраля, 2018 Поделиться Опубликовано 27 февраля, 2018 33 minutes ago, ReWanet said: Ну то есть все же я правильно понял Да, всё примерно так, как ты и описываешь, за исключением что структура у Андрея получается следующая (можешь пока не смотреть и проверить меня как посмотришь сам ): Spoiler local table_Cash = { { edit = UDF1.CEEdit1, lastText = '' }, { edit = UDF1.CEEdit2, lastText = '' } -- ... } Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 27 февраля, 2018 Поделиться Опубликовано 27 февраля, 2018 (изменено) 12 минут назад, srg91 сказал: Да, всё примерно так, как ты и описываешь, за исключением что структура у Андрея получается следующая (можешь пока не смотреть и проверить меня как посмотришь сам ): Да понял. Ну и это удобней Изменено 27 февраля, 2018 пользователем ReWanet Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 27 февраля, 2018 Поделиться Опубликовано 27 февраля, 2018 Хороший тутор по работе с таблицами в том числе показаны варианты заполнения таблиц Ссылка на комментарий Поделиться на другие сайты Поделиться
X86Jumps Опубликовано 27 февраля, 2018 Поделиться Опубликовано 27 февраля, 2018 чтоб не тормозило то можно ограничить перезапись значения текста, когда надо только и если ты знаешь какие адреса нужно проверять то может добавить запись в зареганный символ и его и считывать Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения