|
|
|
Разработка findcolor, findimage, Pure lua |
|
|
Cockney |
2.6.2021, 15:58
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21062
Пользователь №: 16.156
|
Цитата(sutra @ 2.6.2021, 15:37) А если попробовать unsigned int вместо int, какой будет результат? Вроде отрицательные координаты ни к чему. Хотя я понимаю, интересует вопрос ПОЧЕМУ так происходит.
Конечно надо понять причину, но принципе можно просто сдвинуть данные, пусть первые будут типа буфером.
Ничего не поменяется. Просто числа будут не отрицательные. Кажется установил причину такого поведения. Вся проблема в таком участке кода: Код // std::get возвращает ССЫЛКУ на вектор // при этом компилятор выведет тип res как std::vector<FoundImage>, т.е. полноценный ОБЪЕКТ auto res = std::get<std::vector<FoundImage>>(m_storage);
Т.е. происходит неявное копирование данных из хранилища в объект на стеке, а дальше указатель на данные в этом объекте уходят в тестовое приложение. Разумеется, когда указатель приходит приложению, то объект разрушается (т.к. лежит на стеке), и адрес становится не валидным. А т.к. с++ нужно максимальное ускорение, то память не обнуляется что видно по логам. фикс заключается в: Код т.е. явно указать компилятору, что это ссылка на тип, который он должен вывести. Ладно я неопытный, но компилятору даже с самыми строгими настройками проверок на это пофиг, ну как так то.....
|
|
|
|
Cockney |
2.6.2021, 16:40
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21062
Пользователь №: 16.156
|
Цитата(sutra @ 2.6.2021, 16:07) Я вот что ещё хотел сказать. Препроцессинг, а он вообще нужен? У тебя и так вроде всё быстро, какой смысл ещё чего-то придумывать. А самое главное, что вряд ли что-то можно сильно улучшить. В одном случае будет лучше, а в другом хуже. Фишка в том, что надо искать неизвестно что, на экране где тоже неизвестно что может находиться. Я не знаю какой тут надо разрабатывать ИИ и на какой основе.
В том то и дело, что быстро за счет него. По сути это "подготовка образов" для поиска, только автоматически. Т.е. выделение какой-то части по которой можно точно найти что-то на экране. Конечно, где-то хуже, где-то лучше, но и этот препроцессинг можно сделать как угодно. Можно выделять строго уникальные пиксели, можно скопления пикселей определенного цвета и т.д. Фишка в том, что основной алгоритм поиска не меняется, и мы просто снижаем кол-во данных для обработки. Да и утверждение о том, что ничего не известно немного неверно. У нас есть картинка, которую нужно найти, имеем пределы погрешности поиска, разбег каналов цвета и т.п.
|
|
|
|
DarkMaster |
2.8.2021, 1:45
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27723
Пользователь №: 11.279
|
Я, к сожалению, не случайно выбрал формулировку. Хотелось бы все-таки с луа все это делать (уж прости грешного). А по адресам там бегать только через cast, который садит скорость до безумия. Т.е. идейно обращение в виде arr[x][y], при этом очевидно, что компилятор должен понимать, что там есть выравнивание. Ну либо я просто не догоняю как без просадки скорости бегать чистыми указателями в рамках ffi. Цитата Иначе говоря - просто создать указатель на непрерывный блок нельзя. Без копирования в смысле. Ну вообще и да и нет. По крайней мере создав указатель на массив в ffi и указав тип данных ты спокойно можешь бегать индексами. Т.е. тут в чистом виде дает стрелять себе в ногу и речи о провеках чего либо просто нет - у тебя свободный доступ к памяти и ты спокойно можешь выйти за пределы массива с определенным шансом схватив эксепшн. копировать же в память изображение, потом это изображения копировать еще раз меня коробит просто до какого-то безумия. быдлячество полное.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Cockney |
2.8.2021, 2:01
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21062
Пользователь №: 16.156
|
Цитата(DarkMaster @ 2.8.2021, 1:41) при этом очевидно, что компилятор должен понимать, что там есть выравнивание.
Не должен. Да, выравнивание есть для полей структур и элементов массивов, но применить напрямую к битмапу нельзя, ибо компилятор вообще не в курсе, что вот у какого-то указателя там каждый условный 30 байт будет выравниванием и максимум что может сделать, это выравнивать каждый пиксель до машинного слова, а это несовместимо с самим форматом bmp + оверхед по памяти. А идея с доступом "arr[x][y]" (если речь именно о битмапе) не будет работать без просадок в чем-то ни на одном языке. Так устроен формат. Либо пихай в какие-то внутренние структуры и трать процессор на парсинг, либо каждый раз при обращении считай новое смещение. Цитата(DarkMaster @ 2.8.2021, 1:45) Ну вообще и да и нет. По крайней мере создав указатель на массив в ffi и указав тип данных ты спокойно можешь бегать индексами. Т.е. тут в чистом виде дает стрелять себе в ногу и речи о провеках чего либо просто нет - у тебя свободный доступ к памяти и ты спокойно можешь выйти за пределы массива с определенным шансом схватив эксепшн.
Во-первых, в какую именно ногу попали-то ? Размеры известны, обсчитывай ограничения сколько влезет... Во-вторых, а кто мешает создать обертку ? Ну индекс то вроде не сложно посчитать и проверить, можно даже конец массива просчитать и при доступе проверять... Цитата(DarkMaster @ 2.8.2021, 1:45) Ну вообще и да и нет. По крайней мере создав указатель на массив в ffi и указав тип данных ты спокойно можешь бегать индексами.
Хочу посмотреть как будет выглядеть описание типа данных, зная, что шаг выравнивания динамический и идет после каждой "строки", а не после каждого элемента, и по факту зависит от ширины изображения и не известен при компиляции. Цитата(DarkMaster @ 2.8.2021, 1:45) быдлячество полное.
цена абстракций
|
|
|
|
sutra |
2.8.2021, 10:19
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Я уж просто перестал говорить на эту тему. Надоело. Смысл очень прост. Уйма примеров которые однозначно говорят, что при достижении какого-то количества итераций в циклах, lua начинает тормозить. Примерно в 4 раза, поэтому сделать скоростной и универсальный финд, на мой взгляд, проблематично. Буквально на днях, когда хотел попробовать сделать свой таймер (до того как мне показали красивое решение), натолкнулся опять на эти грабли. Там совсем всё просто было. НО при больших циклах - якорь. Это какая-то фишка компилятора, возможно и её можно обойти. Мне понятно одно, если этот якорь не устранить, то проблема со скоростью возникнет однозначно.
На своём финде тоже всё это обкатывал не раз. При малых зонах поиска - результат по скорости практически один в один как в бенчмарке (не учитывая потоки). Решил попробовать и распихал в разные потоки куски зон поиска - результат почти как в бенчмарке. НО стоило увеличить циклы (зоны поиска или величину картинок) - ЯКОРЬ.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|