Здравствуйте, гость ( Вход | Регистрация )

18 страниц V « < 8 9 10 11 12 > »   
Ответить в эту темуОткрыть новую тему
> Новая Версия Uopilot v.2.40 (05.11.2017), Официальный сайт. Скачать. Последняя версия.
WKnight
сообщение 1.11.2018, 14:47
Сообщение #181


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Точно, спасибо.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 1.11.2018, 15:52
Сообщение #182


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



findcolor в памяти не работает.

1) вариант когда работает (хотя тоже не на всём скрине)
set %pic GetImage (508 243 970 777)
set #sp findcolor (0 0 20 0 ...

2) вариант когда НЕ работает
set %pic GetImage (0 0 970 777)
set #sp findcolor (508 243 528 243 ...


И вот ещё какая штука
GetImage (0 0 1919 1079)
Если потом сохранить в файл, то сохранит именно эту область 1920х1080 с остатками рабочего стола и чернотой, где рабочий стол закончился. В принципе ничего такого, просто для информации.

Да, вот ещё, для информации. Рабочее окно располагалось на 2-ом мониторе.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 1.11.2018, 16:38
Сообщение #183


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Цитата
Возможно это:
и
Цитата
Я же не для себя

Исправил в 'findimage' поиск запомненной картинки в загруженной области. Требовало размер области больше положенного.

Переделал в Lua функции 'findimage' и 'findcolor' на новый синтаксис, все параметры передаются по одному, через запятую. Путь к файлу и набор цветов пока передаются строкой в таблице (в фигурных скобках). Принимающий массив изъят из обращения. По синтаксису Lua в пути необходимо удваивать символ обратный слеш "c:\\", либо указывать путь в двойных квадратных скобках [[c:\]]. Функции возвращают массив (таблицу) найденных элементов и код ошибки. Пример:
'arr, err = findimage(10, 20, 1020, 810, {"C:\\tmp\\image.bmp"}, 2)'
'arr, err = findcolor(10, 20, 1040, 810, {"r(255)"}, 2, -1, "abs")'

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 1.11.2018, 23:34
Сообщение #184


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Примерно выяснил где глюк колора.
set %pic GetImage (0 0 970 777)
set #type %pic[1 1]
set #sp findcolor (508 243 528 243 1 1 (R(0-255)) %sp %pic[1 1])
save_array %sp "C:\TMP\_memory.txt"

Первый столбец всё как надо, а вот второй столбец все нули, грубо говоря путает ординату поиска.

Похоже я один только и пользуюсь (пытаюсь) поиском в памяти.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 2.11.2018, 13:04
Сообщение #185


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26812
Пользователь №: 16.971
Возраст: 29



Цитата
Исправил в 'findimage' поиск запомненной картинки в загруженной области.

Видимо не всё исправлено.
Код
set %get [1] LoadImage (скрин_окна.bmp)
set %image [1] LoadImage (Original.bmp)

log clear
log mode compact
set #a Findimage(0 0 1032 956 (%image [1 1]) %arr %get [1 1] 100)
if #a > 0
    log #a    %arr [1 1] %arr [1 2]    %arr [1 3] %arr [1 4]   // координаты искомой картинки
end_if

set #a Findimage(300 0 700 956 (%image [1 1]) %arr %get [1 1] 100)
log #a   // не найдено

set #a Findimage(0 100 1032 956 (%image [1 1]) %arr %get [1 1] 100)
log #a   // не найдено
end_script

Прикрепленный файл  Original.bmp ( 654 байт ) Кол-во скачиваний: 236

Прикрепленный файл  скрин_окна.bmp ( 2,82 мегабайт ) Кол-во скачиваний: 235
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.11.2018, 20:04
Сообщение #186


***********

Модератор UOPilot
Сообщений: 9.740
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29642
Пользователь №: 11.279



Пилот поверх всех окон, файл/открыть скрипт - форма за окном пилота и не видна.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 3.11.2018, 16:36
Сообщение #187


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



--lua
arr, err = findcolor(0, 0, 100, 100, 1, 1, {"r(0-255)"})
log(arr,err) -- получаю nil 0

Что я делаю не так?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 3.11.2018, 16:56
Сообщение #188


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



local a = findcolor("0, 0, 10, 0, 1, 1, 0, %arr, 2")
log (#arr) -- а вот так ищет

Получается новый вариант синтаксиса не работает.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 3.11.2018, 16:56
Сообщение #189


***********

Модератор UOPilot
Сообщений: 9.740
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29642
Пользователь №: 11.279



попробуйте явно указать метод:
arr, err = findcolor(0, 0, 100, 100, 1, 1, {"r(0-255)"},2)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 3.11.2018, 17:15
Сообщение #190


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



r(0-255) диапазон так и не понял как искать ни в старом, ни в новом варианте.

Цитата
попробуйте явно указать метод

Всяко пробовал.

В новом синтаксисе вообще ничего не ищет.

В смысле принимающий массив = nil

arr, err = findcolor(0, 0, 199, 0, 1, 1, 0, 2)
log(arr,err) -- получаю nil 200

Массива нет, а вместо кода ошибки - количество найденных пикселей.

arr, err = findcolor(0, 0, 199, 0, 1, 1, {"r(0)"}, 2)
log(arr,err) -- получаю nil 0

Диапазон вообще не ищет.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 6.11.2018, 2:34
Сообщение #191


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Ещё давно возник у меня такой вопрос, конечно я обхожу эти "рифы", но решился всё-таки озвучить. Почему, например, такая конструкция у меня выполняется более 4 секунд?

set #tmp findcolor (244 639 825 922 1 1 (R(0-255)) %tmp)

Подозреваю, что что-то не так с массивом. Конечно корифеи скажут, а зачем такое вообще надо. Но мне часто требуется не просто искать конкретный цвет, а именно получить цвета всех пикселей конкретной зоны экрана (зачастую немаленькой, ввиду разброса объектов), желательно минимальным количеством вызова файнда, для детального анализа. Получать из памяти такой массив я пока не пробовал (жду доводки файнда). Но 4 секунды, на мой взгляд, как-то не вяжутся с логикой процесса.


Обработка в lua любого массива данных занимает доли секунды, вопрос как получить эти данные с минимальными затратами времени.

И всё-таки ещё раз "о главном". Конечно запрограммировать можно и "свалку" данных. Но не все будут этим заниматься, а на мой взгляд, нужна реализация поиска findcolor-ом цветовой разницы между RGB каналами. У меня без этого никак невозможно правильно запрограммировать поиск объектов при смене времени суток в игре.

Да и не только при смене времени суток, часто встречаются "переливающиеся" объекты, их тоже можно "вычислить" только анализом RGB.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 6.11.2018, 2:48
Сообщение #192


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



И опять же. С помощью таких конструкций, скрипт собирал статистику и то, что на первый взгляд казалось в принципе невозможным запрограммировать, на поверку оказалось возможным, иногда "на грани фола", но возможным.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 6.11.2018, 4:39
Сообщение #193


***********

Модератор UOPilot
Сообщений: 9.740
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29642
Пользователь №: 11.279



Цитата
Почему, например, такая конструкция у меня выполняется более 4 секунд?

set #tmp findcolor (244 639 825 922 1 1 (R(0-255)) %tmp)

Указать в явном виде метод поиска (2 или хендл). Вообще у пилота есть проблема с большими массивами. Он их ворочить начинает реально медленно. Я так подозреваю он очень не оптимально выделяет память, потом выделяет еще и при этом копирует массив и т.д. Я больше склоняюсь к попыткам допинать финд в рамках луа. Учитывая заданный диапазон могу предложить указать его не по каналам, а в десятичной форме - это может решить проблему.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 6.11.2018, 13:22
Сообщение #194


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Цитата
Я больше склоняюсь к попыткам допинать финд в рамках луа


Абсолютно согласен.

Цитата
указать его не по каналам, а в десятичной форме


Спасибо, попробую.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 6.11.2018, 14:08
Сообщение #195


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Цитата
указать его не по каналам, а в десятичной форме


Попробовал всяко - результат тот же.


Может можно как-то из памяти массив вытащить? Если сначала получить скрин в память.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 6.11.2018, 14:48
Сообщение #196


***********

Модератор UOPilot
Сообщений: 9.740
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29642
Пользователь №: 11.279



Цитата


Может можно как-то из памяти массив вытащить? Если сначала получить скрин в память.

Когда вы получаете скрин в память, то в массив возвращается указатель на начала битовой маски. Дальше readmem и погнали. НО - я писал уже подобный обработчик и скорость его оказалась крайне печальной, я подозреваю, что это было вызвано двумя причинами:
1) Преобразование параметров из стринга в инты и обратно, парсинг параметров. Тогда это еще не было допилино нормально.
2) Вызов внешней функции не встроенной в луа занимает существенное время. Тут хотелось бы попросить кнайта попытаться разобраться в чем проблема. Хотя бы понять это косяк наш или сам луа вызывает тормознуто (создать микро функцию-заглушку и проверить время ее вызова).


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 6.11.2018, 15:19
Сообщение #197


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Я тестировал все функции связанные с обработкой изображений, от printscreen до getimage. И все они выполняются примерно 3 сотых секунды, хоть в Пилоте, хоть в lua. Собственно поэтому я и пытаюсь вызывать эти функции ОДИН раз, потому что весь остальной скрипт на lua (далеко не маленький) выполняется 13-18 ТЫСЯЧНЫХ секунды.

С загрузкой из файла массива, потом сохранением в файл (правда всё на RAM) и всего 18 тысячных.

readmem не совсем понимаю как пристроить под это дело. В lua я мало что знаю, раньше я просто использовал move в указатель, выделив соответствующую память.

Нужно Кнайту просто сделать этот самый move.

Насколько я понял getimage возвращает параметр длины 3 байта * кол-во пикселей + 2 байта.

Хотя наверное move не прокатит. 3 байта - это формат файла, их не пристроишь никак под переменные.

Проще наверное посмотреть, почему файнд так начинает тормозить.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 6.11.2018, 16:07
Сообщение #198


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Вот если бы readmem мог считывать в побайтовый массив, типа как в строку, только без ограничения по длине. Тогда можно было бы сделать быстрый обработчик.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 6.11.2018, 18:28
Сообщение #199


***********

Модератор UOPilot
Сообщений: 9.740
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29642
Пользователь №: 11.279



Цитата
Вот если бы readmem мог считывать в побайтовый массив, типа как в строку, только без ограничения по длине. Тогда можно было бы сделать быстрый обработчик.


Дык он и делает. Там в параметрах задается тип значения которое нужно считать. Байт - b.
Для понимания, что именно вы читаете рекомендую сначала использовать writemem и редактировать область памяти с битовой маской.

set %a GetImage (100 100 1000 1000)
log %a [1 1] - адрес в памяти
log %a [1 2] - ширина изображения
log %a [1 3] - высота изображения
log %a [1 4] - длина строки в байтах
End_script

Там есть тонкость - размер таблицы выравнивается по количеству байт кратному 4, если мне память не изменяет. Т.е. длина строки в любом случае будет кратная 4. Поэтому настоятельно рекомендую сначала разобраться c writemem, чтобы не путаться в чтении каналов.
Это кстати косяк, т.к. выравнивание служит для увеличения скорости обработки процессором, но современные камни почему-то под кратность 10 точатся(для меня великая загадка почему 10 ибо это корявый размер во всех смыслах).

Пытаюсь найти скрипт в котором все это делал - пока безрезультатно.

Обработка изображения
Код
--lua
fileBinary = require"luaPlugins\\FileBinary"

do
    local tab = ""
    local deep = 0
    function table.show(t, comment)
        -- Пишем в лог комментарий.
        deep = deep + 1 -- Уровень вложенности вызовов функции.
        --log(comment .. commentSended .. deep)
        if  comment ~= nil and deep == 1 then
            log(comment)
        end


        if     type(t) == "nil"     then log("table is nil")
        elseif type(t) == "string"  then log('table is string: "'..t..'"')
        elseif type(t) == "number"  then log('table is number: '..t)
        elseif type(t) == "table"   then
            local elementsInTable = 0
            for k,v in pairs(t) do
                if  type (v) == "table" then
                    if type(k) == "string" then
                        log(tab..'table: "'..k..'"')
                    else
                        log(tab..'table: '..k)
                    end
                    tab = tab .. "    "
                    table.show(v)
                    tab = string.sub(tab, 1, -5)
                    elementsInTable = elementsInTable + 1
                else
                    elementsInTable = elementsInTable + 1
                    if type(v) == "string" then v = '"'..v..'"' end
                    if type(k) == "string" then k = '"'..k..'"' end
                    log(tab..""..k.." = "..v)
                end
            end
            if elementsInTable == 0 then log("table is empty") end
        else
            log('table is unknow data type')
        end
        -- Пишем в лог комментарий.
        deep = deep - 1 -- Уровень вложенности вызовов функции.
    end
end

log("clear")



-- Получаем изображение в массив.
function imageToArray (startX, startY, endX, endY, appWindow)
    local bitmap = {}
    local address, w, h, l = getimage(startX, startY, endX, endY, appWindow)
    log (address, w, h, l, "n56")
    local pos = 1
    for i=address, address + h*(l) - 1, l do
        for j=i, i+w*3 - 1 do
            bitmap[pos] = readmem(j .. " b")
            pos = pos + 1
        end
    end
    saveimage(address, "d:\\!lua\\!test.bmp")
    deleteimage(address)
    return bitmap
end


function binary(file, pos, val, i, j)
    file:seek("set", pos)
    if i == nil then i =  1     end
    if j == nil then
        j =  #val - 1
    else
        j = i + j - 1
    end
--    log(i, j)
    for i=i, j do
        file:write(string.char(val[i]))
    end
end

-- file - хендл или имя файла
-- w - ширина изображения
-- h - высота изображения
function writeBmp (file, bitmap, w, h)
    if type(file) == "string" then
        file = io.open(file, "w+b")
    end
    file:seek("set", 0)

    local l = math.ceil (w*3/4) * 4 -- Длина строки с выравниванием.
    local alignment = l - w*3
    local fileSize = l * h + 0x36
    log(fileSize)


    -- Заголовок
    file:write(string.char(0x42))
    file:write(string.char(0x4D))
    file:write(string.char(         -- Размер файла.
    fileSize%256,
    floor(fileSize/256),
    floor(fileSize/65536),
    floor(fileSize/16777216)))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0x36))   -- Оффсет на битовую маску.
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0x28))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(floor(w%256)))  -- Ширина
    file:write(string.char(floor(w/256)))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(floor(h%256)))  -- Высота
    file:write(string.char(floor(h/256)))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0x01))
    file:write(string.char(0))
    file:write(string.char(0x18))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0x74))
    file:write(string.char(0x12))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0x74))
    file:write(string.char(0x12))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))


    local i = #bitmap - w*3 + 1
    for i = w*3*(h-1)+1, 1, -w*3 do
--        log("!!!", #bitmap, file:seek() ,i, h, w, w*3, l)
        binary(file, file:seek(), bitmap, i, w*3)
        for j = 1, alignment do
            file:write(string.char(0))
        end
    end

--    for pos=0x36, 0x36 + #bitmap - 1, l do
--        log("!!!", #bitmap, pos ,i, h, w, w*3, l)
--        binary(file, pos, bitmap, i, w*3)
--        i = i - w*3
--    end
end

function getAvg(path, appWindow, timeout, startX, startY, endX, endY)
    local countImages = 0
    local w = endX - startX + 1
    local h = endY - startY + 1
    local s = w * h * 3 -- количество полезных пикселей (без выравнивания)
    local sum = {} -- сумма значений каждого канала всех изображений.
    for i = 1, s do
        sum[i] = 0
    end
    -- Собираем изображения в течении заданного времени.
    local myTimer = os.clock() + timeout
    while myTimer > os.clock() do
        -- Массив со значениями каналов.
        local bitmap = imageToArray (startX, startY, endX, endY, appWindow)
        --table.show(bitmap)
        -- Суммируем изображения
        for i = 1, s do
            sum[i] = sum[i] + bitmap[i]
        end
        countImages = countImages + 1
    end

    -- Находим среднее значение
    local avg = {}
    for i = 1, s do
        avg[i] = sum[i] / countImages
    end
    --table.show(avg, "avg")
    writeBmp (path, avg, w, h)
end


function getStatic (path, appWindow, timeout, startX, startY, endX, endY)
    local bitmap = imageToArray (startX, startY, endX, endY, appWindow)
    local w = endX - startX + 1
    local h = endY - startY + 1
    local countImages = 0
    -- Собираем изображения в течении заданного времени.
    local myTimer = os.clock() + timeout
    local bench = os.clock()
    while myTimer > os.clock() do
        -- Массив со значениями каналов.
        local scr = imageToArray (startX, startY, endX, endY, appWindow)
        log("Битмап в массив за:" .. os.clock() - bench .. " сек.")
        bench = os.clock()
        -- Закрашиваем нестатичные пиксели.
        for i = 1, #bitmap, 3 do
            if  bitmap[i  ] ~= scr[i  ] or
                bitmap[i+1] ~= scr[i+1] or
                bitmap[i+2] ~= scr[i+2] then

                bitmap[i  ] = 0
                bitmap[i+1] = 255
                bitmap[i+2] = 0
            end
        end
        log("Поиск статики за:" .. os.clock() - bench .. " сек.")
        countImages = countImages + 1
    end
    writeBmp(path, bitmap, w, h)
end

    if workwindow ~= tonumber(windowhandle()) then
        log("Привязка должна быть к пилоту.")
        workwindow = tonumber(windowhandle())
        alarm("online")
        return
    end


    startX, startY, endX, endY = 194, 286, 277, 434
    appWindow = findwindow("Crossout 0.")[1][1]
    log(appWindow)
    --if 1 then return end


    local cpuTime = os.clock()
    -- getAvg("d:\\!lua\\test" .. os.time().. ".bmp", appWindow, 5, startX, startY, endX, endY)
    getStatic("d:\\!lua\\test" .. os.time() ..".bmp", appWindow, 60,
    193, 286
    ,
    208, 432
    )
    getStatic("d:\\!lua\\test" .. os.time() ..".bmp", appWindow, 60,
    193, 615
    ,
    210, 762
    )

    log(os.clock() - cpuTime)
    alarm("online")

FileBinary
Код
--lua

local binary = {}

function binary.getBitmapOffset(file)
    return binary.readInt(file, 0x0A)
end

function binary.readInt(file, pos)
    file:seek("set", pos)
    local a = string.byte(file:read(1))
    file:seek("set", pos + 1)
    local b = string.byte(file:read(1))
    file:seek("set", pos + 2)
    local c = string.byte(file:read(1))
    file:seek("set", pos + 3)
    local d = string.byte(file:read(1))
    file:seek("set", pos + 4)
    return a  + b * 256 + c * 65536 + d * 16777216
end

function binary.writeInt(file, pos, val)
    file:seek("set", pos)
    return file:write(
    string.char(math.fmod(val, 256),
    math.fmod(val, 65536)/256,
    math.fmod(val, 16777216)/65536,
    val/16777216)
    )
end

function binary.readByte(file, pos)
    file:seek("set", pos)
    return string.byte(file:read(1))
end

function binary.writeByte(file, pos, val)
    file:seek("set", pos)
    return file:write(string.char(val))
end

function binary.readArray(file, pos, sz)
    local result = {}
    file:seek("set", pos)
    local s = file:read(sz)
    for i=1, #s do
        table.insert(result,string.byte(string.sub(s, i, i)))
    end
    return result
end

-- Пишет в бинарном виде данные в файл file
-- начиная с позиции pos
-- из таблицы или строки val
-- начиная с позиции i внутри val
-- размером j внутри val
-- Запись полный тормоз.
-- Массив 2.296 Мб/сек.

function binary.writeArray(file, pos, val, i, j)
    file:seek("set", pos)
    if i == nil then i =  1     end
    if j == nil then
        j =  #val - 1
    else
        j = i + j - 1
    end
    log(i, j)
    for i=i, j do
        file:write(string.char(val[i]))
    end
end

return binary

--f = io.open("d:\\test.bmp", "r+b")
--log(f)
--log(binary.readInt(f, 0))
--log(binary.writeInt(f, 0, 0x123456ab))
--log(dec2hex(v))
--v="1234567890"
--log(string.byte(v, 1, 10))
--t = binary.readArray(f, 0, 4096)


--local j = 0
--local t = {}
--for i = 1, 40100 do
--    if j < 255 then
--        j = j + 1
--    else
--        j = 1
--    end
--    t[i] = j
--end
--binary.writeArray(f, 0x36, t, 1, 40100)


--local j = 0
--local t=""
--for i = 1, 40100 do
--    if j < 255 then
--        j = j + 1
--    else
--        j = 1
--    end
--    t = t .. string.char(j)
--end
--
--f:seek("set", 0x36)
--myTimer = os.clock()
--for i=1, 1000 do
--    f:write(t)
--end
--log(os.clock() - myTimer)



Выложил ровно в том виде, в котором оно осталось. Это фактически были тесты производительности и возможностей. Т.е. там свинарник =) . FileBinary мог редактироваться отдельно и возможно не имеет обратной совместимости либо имеет баги.

Сообщение отредактировал DarkMaster - 6.11.2018, 18:29


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 7.11.2018, 1:02
Сообщение #200


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Цитата
скрипт в котором все это делал

Круто, вижу глобальный подход для решения любых задач. Как ты читаешь я понял, спасибо. Но пока подожду, прежде чем ломать мозги, надеюсь Кнайт доведёт финды и чтение памяти не потребуется. Ну а если потребуется, то я наверное буду делать выборочное чтение. Из огромной области экрана требуется обычно 2-3 десятка пикселей, просто из разных мест. Для ускорения работы лучше наверно задавать какие пиксели нужны и ридмемом читать только их, конечно индекс чтения нужных байтов в памяти придётся вычислять, но всё равно это будет намного быстрее.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

18 страниц V « < 8 9 10 11 12 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 3.7.2025, 20:42
Designed by Nickostyle