|
|
|
Разработка findcolor, findimage, Pure lua |
|
|
Cockney |
18.12.2023, 21:32
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21065
Пользователь №: 16.156
|
Что в твоем понимании искать в адекватной области ? Предположим, паттерн 10х10 может быть найден в самом начале области поиска 0,0,10,10 по последним 3 пикселям. Точность и прочее не рассматриваем. Вот как мне начать сравнивать начало области поиска [0,0;0,0;0,0] с куском паттерна [9,7;9,8;9,9] ?
|
|
|
|
Cockney |
19.12.2023, 21:32
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21065
Пользователь №: 16.156
|
Блин, наверное не могу с первого раза доносить смысл... нет, меня интересует строго алгоритм без привязки к реализации. И мне интересно как можно находить паттерны, НАЧАЛО которых лежит ЗА областью поиска, а в самой области поиска находится 3-5 пикселей или того меньше, при этом производительность не должна улетать в помойку из-за постоянных проверок выхода за область. Например, cirus, страниц 5-6 назад находил такие кейсы, собственно поэтому ты мне там и пытался объяснить как якобы это в пилоте работает (работало).
если там алгоритм такой: ищем в паттерне первый пиксель который подходит, и только потом продолжаем сравнивать остальные, то мне понятна механика такая, НО мне не понятно как такое работает, если там потенциально могут большие куски пропускаться без проверок из-за какого-то смещения на 1 пиксель.
|
|
|
|
Cockney |
21.12.2023, 22:04
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21065
Пользователь №: 16.156
|
Цитата(DarkMaster @ 21.12.2023, 19:14) конкретно в пилоте - все утекает. если брать сферического коня в ваккууме, то я бы просто разбивал паттерн на саб паттерны, которые искались бы исключительно внутри области. подобная разбивка практически бесплатная по ресурсам. жрут там только ифы при сравнении каналов, а обрезка, конвертация и прочее - меньше десятой доли процента. если совсем жестить, то можно попробовать вкрутить некоторую хитрую формулу по математике указателей, но это будет медленнее.
Цитата конкретно в пилоте - все утекает т.е. много ситуаций, когда должен был найти, но не нашел ? Цитата просто разбивал паттерн на саб паттерны, которые искались бы исключительно внутри области что это дает ? условно, делить паттерн на 4 части, и искать только те, которые влезают в область ? ну это можно и так сделать, без какой то разбивки.
|
|
|
|
DarkMaster |
22.12.2023, 19:44
|
Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27737
Пользователь №: 11.279
|
Цитата без какой то разбивки. можно, но на математике указателей будет просадка, плюс у тебя чтение будет не оптимизировано. Цитата т.е. много ситуаций, когда должен был найти, но не нашел ? в пилоте утекает производительность за счет попыток поиска на полях. Цитата что это дает ? сколько раз ты будешь считать смещения? Ну вот скажем ты пошел обрабатывать верхнее поле. И у тебя нужно каждый раз вворачивать доп математику указателя. Ищем мы пусть в фулл хд, паттерн 10х10 пикселей, точность позволяет сделать 3 пикселя на вертикальном поле. Т.е. нам нужно будет каждый канал, каждый пиксель считать при этом со смещением. 1920*10(ширина)*3(каналы)*1(самое верхнее положение паттерна, только один пискель может быть ошибочным) + 1920*10(ширина)*3(каналы)*11(забег на поле 2 линии) + 1920*10(ширина)*3(каналы)*21 И все это будет считаться каждый раз. Зачем? Причем это идеальный случай, когда у нас вообще ничего нигде не совпадает и поиск сразу переходит к следующей позиции. А если оно будет срываться на последнем пикселе? У нас просадка будет очень существенной. Я этими тестами занимался три месяца. Так делать короче не нужно) По поводу не найдет - тут есть фатальный баг. Хз как он пролез, но если не будет найден самый редкий пиксель на паттерне - то поиск ничего не найдет. Это катастрофа. Обнаружилось с год назад. Т.е. как правило если второй слева верхний пиксель не найден, то изображение вообще не будет найдено. Отсюда и пушечная скорость ибо он огромный кусок проверок просто выкидывает. Я видел исходник финдимиджа. Там много заморочек и оптимизаций. Практически все из них я перепробовал при создании своего аналога. Ирония в том, что эти оптимизации должны работать по логике, на практике очень много вопросов. Так же часть из них отсеялась математически из-за сильного перекоса вероятностей. Личено я пришел к тому, что сам поиск должен быть максимально примитивен и предсказуем для предвыборки процессора. Кстати а есть какие-нибудь способы сказать компилятору "вот это держи в регистрах проца"? Все остальные оптимизации - это кэш паттернов (прирост примерно в 10 раз, если НЕ ssd), уход к самостоятельному менеджменту памяти без free и malloc при каждом вызове.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Cockney |
22.12.2023, 20:05
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21065
Пользователь №: 16.156
|
Цитата чтение будет не оптимизировано. это широкий вопрос, нужно по факту смотреть как читается куда и что, в общем случае идеальное чтение э то линейный проход по памяти. Цитата 1920*10(ширина)*3(каналы)*1 я делал математику без делений / умножений, считать там не так много на самом деле. но т.к. у меня в целом алгоритм кривой - я не замерял скорость на такой математике. Цитата если не будет найден самый редкий пиксель на паттерне - то поиск ничего не найдет. Это катастрофа. Обнаружилось с год назад. Т.е. как правило если второй слева верхний пиксель не найден, то изображение вообще не будет найдено. так самый редкий или второй ? мне кажется это то, о чем я и писал - если в начале мы не смогли найти пиксель от которого далее пойдем искать, то сразу скипаем потенциально стоящие для проверки места. Цитата Я видел исходник финдимиджа. пошарить возможно, или гриф секретности ? Цитата Личено я пришел к тому, что сам поиск должен быть максимально примитивен и предсказуем для предвыборки процессора это не всегда работает, т.к. есть ассимптотическая сложность. если тебе физически возможно перелопатить в 3-4 раза меньше данных чем обычно, то там все равно на кеш процессора и прочее - скорость будет выше, если не брать какие-нибудь пограничные случаи. Цитата Кстати а есть какие-нибудь способы сказать компилятору "вот это держи в регистрах проца"? вроде как можно, но обычно компилятор это делает без подсказок и старается максимально напрягать регистры процессора, а не память. если дошли руки до таких оптимизаций, то вероятней всего горячий код имеет смысл вообще на ассемблере написать, ну либо алгоритм менять.
|
|
|
|
DarkMaster |
22.12.2023, 20:22
|
Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27737
Пользователь №: 11.279
|
Цитата это широкий вопрос, нужно по факту смотреть как читается куда и что, в общем случае идеальное чтение э то линейный проход по памяти.
да, но в общем случае у нас будет, как раз разрыв линейности если мы используем некторый субпаттерн по средствам указателей. Цитата я не замерял скорость на такой математике. я замерял. Не надо так делать. Цитата
так самый редкий или второй ? мне кажется это то, о чем я и писал - если в начале мы не смогли найти пиксель от которого далее пойдем искать, то сразу скипаем потенциально стоящие для проверки места.
Если все цвета уникальные либо повторяются одинаковое количество раз - второй пиксель. А вообще самый редкий. Просте если редких несколько, то счтаем слева-направо, сверху-вниз. Какой попался первым тот и будет критическим. Цитата пошарить возможно, или гриф секретности ?
Не уверен, что он у меня есть с собой. Я не в россии и без разрешения кнайта я шарить не буду. Чужое я не трогаю - решать не мне. Цитата это не всегда работает, т.к. есть ассимптотическая сложность. если тебе физически возможно перелопатить в 3-4 раза меньше данных чем обычно, то там все равно на кеш процессора и прочее - скорость будет выше, если не брать какие-нибудь пограничные случаи.
Согласен, но мои соображения привели к тому, что лучше получить некторое усреднение работы, чем те перекосы по скорости которые могли быть. Условно говоря я не хочу получать 2x скорость в 50%, если в остальных 50% случаев будет 0.5х, а эти случаи еще и наиболее медленные в силу заданных точности/девийшена/размеров. Т.е. можно получить пушку на примитивных случаях и тормоз на и без того сложных и медленных. Да это зависит от ситуации, но поведение должно быть прогнозируемым и простой поиск он и без того будет достаточно быстрым, чтобы не вызвать проблем, а вот медленные моменты нужно ускорять. Цитата вроде как можно, но обычно компилятор это делает без подсказок и старается максимально напрягать регистры процессора, а не память. если дошли руки до таких оптимизаций, то вероятней всего горячий код имеет смысл вообще на ассемблере написать, ну либо алгоритм менять. Однозначно да, но я асм не знаю. Даже садился начинал учить, но понял, что тогда опять все затянется и вот это вот все... Так же у меня большие сомнения, что я смогу написать реально оптимизированный код на асме. Там своих трюков три вагона. К тому же имея явную концепцию самого финда переписать сам перебор потом будет намного проще ну или на худой конец привлечь кого-то, кто действительно хорошо умеет писать на асме код с оптимизациями. Сообщение отредактировал DarkMaster - 22.12.2023, 20:22
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
23.12.2023, 18:58
|
Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27737
Пользователь №: 11.279
|
Цитата он будет в любом случае, т.к. паттерн (минимум он) ходит туда-сюда и да и нет. паттерн как раз таки самый линейный в плане чтения. даже когда мы переходим на следующую линию по вертикали, мы все так же линейно его читаем. Да, на каждой новой позиции мы начинаем читать с начала, но линейно. Скрин же на каждой новой линии рвется линейность чтения. Это дает сильный эффект. Если же мы паттерн начинаем обрабатывать указателями, как сабпаттерны, то вся линейность (для каждой позиции) будет рваться при новой линии сабпаттерна. Т.е. получим тоже самое, что на скрине. Цитата лично у меня это пара сложений и иногда один-два минуса. это не може быть медленней умножения/деления (за исключением умножения на степень 2, наверное)
ну у меня тоже их нет. точнее нет в поиске. в конверторе есть умножение, которе компилятор вычисляет ровно один раз ибо *restrict. Уверенности не было, что рабоатет, так, как должно, но тесты показали, что он реально не пресчитывает это значение. А ну и на степень двойки умножаю. Так что все красиво относительно. Вопрос не в том, что их не много, а в том, что они есть. И когда у нас большие зоны поиска, большой паттерн, низкая точность, то эти ничтожные пару +/- дают эффект. Естественно это не лютый слив производительности, но он вполне детектируемый на тестах.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Иллидан |
2.2.2024, 19:51
|
Neophyte
Сообщений: 16
Регистрация: 22.3.2023 Группа: Пользователи Наличность: 0
Пользователь №: 20.504
Возраст: 99
|
Цитата(DarkMaster @ 2.2.2024, 21:40) 25 очень много
для постоянно изменяющейся анимированной картинки? Мне тоже показалось что много, но зато работает, иных же способов искать динамичные объекты вроде нету, а этот находит все, но и ложные(поверх/в том же месте найденной картинки) тоже (IMG: style_emoticons/default/sad.gif) несколько лет назад, в другом кликере, такая проблема была решена с помощью добавления границ тела поиска, по которым все найденные одинаковые объекты, в указанном x y радиусе от каждого, считались за 1 объект, чтобы не тыкать в том же самом месте несколько раз(со смещением на 1 или пару пикселей, но всё ещё внутри 1 уже тыкнутого объекта), теперь такое надо и в уопилоте как-то воссоздать (IMG: style_emoticons/default/rolleyes.gif) кажется это можно сделать через goto, просто добавить условие, в котором указывать размер картинки и если разница координат между последовательно найденными картинками будет меньше размера самой картинки, будет считаться что это таже самая картинка и все наложения её копий в том же самом месте будут пропускаться, продолжая поиск в остальных частях экрана, как надо..
|
|
|
|
nykep |
3.2.2024, 6:20
|
Apprentice
Сообщений: 233
Регистрация: 1.9.2012 Группа: Пользователи Наличность: 1214
Пользователь №: 15.246
Возраст: 25
|
Цитата(Иллидан @ 2.2.2024, 19:51) кажется это можно сделать через goto, просто добавить условие, в котором указывать размер картинки и если разница координат между последовательно найденными картинками будет меньше размера самой картинки, будет считаться что это таже самая картинка и все наложения её копий в том же самом месте будут пропускаться, продолжая поиск в остальных частях экрана, как надо..
Можно что-то такое попробовать. Но может быть можно сделать проще, зависит от того что ты делаешь с этими картинками и как они себя при этом ведут, например на экране несколько нужных картинок, делаешь поиск не всех, а одной и после нахождения кликаешь и она пропадает и дальше снова ищешь одну.
|
|
|
|
Иллидан |
4.2.2024, 8:25
|
Neophyte
Сообщений: 16
Регистрация: 22.3.2023 Группа: Пользователи Наличность: 0
Пользователь №: 20.504
Возраст: 99
|
Цитата(nykep @ 3.2.2024, 9:20) Можно что-то такое попробовать. Но может быть можно сделать проще, зависит от того что ты делаешь с этими картинками и как они себя при этом ведут, например на экране несколько нужных картинок, делаешь поиск не всех, а одной и после нахождения кликаешь и она пропадает и дальше снова ищешь одну.
в моём случае, на экране примерно 30 анимированных полупрозрачных картинок одинаковой формы и размера, на разном статичном фоне и после нажатий они просто становятся статичными, а не пропадают, по этому так искать врятле получится (IMG: style_emoticons/default/laugh.gif)
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|