Что нового

Различия быстродействия Pixelsearch и функции на основе WinAPI

mornere

Знающий
Сообщения
22
Репутация
8
В одной из тем поднимался вопрос, какая функция будет работать быстрее, использующая стандартную функцию PixelSearch или берущая цвет через DC и я решил проверить это. Был написан тестовый скрипт, в одинаковых условиях использующий один и тот же алгоритм для определения дистанции в овервью.
Конфиг тестовой машины:
Процессор x86 Family 6 Model 28 Stepping 2 GenuineIntel ~1330 МГц (Atom Z520)
Полный объем физической памяти 1 024,00 МБ
Имя Intel(R) Graphics Media Accelerator 500

Eve запущена с минимальными настройками, 1024х768 Fixed Window, включена звездная карта.
Скрипт был скомпилен в ехе и на время выполнения выставлял себе приоритет 4 - High.

Каждую функцию скрипт прогонял 10 раз, записывая минимальное, максимальное и среднее время выполнения.

не буду выкладывать весь скрипт, укажу только ключевые моменты.
Код:
$hWnd=WinGetHandle("EVE")
if $hWnd <> 0 Then
WinActivate("EVE")
WinWaitActive("EVE")
...
Local $hDC = _WinAPI_GetDC($hWnd)
...
$ColGet=DllCall('gdi32.dll', 'dword', 'GetPixel', 'hwnd', $hDC, 'int', $x, 'int', $y) ;получаю цвет
Local $lay = BitAND($ColGet[0], 0x0000FF) ; беру только 1 слой для сравнения
if Abs($lay-$PartofColor)<=$var Then ;и если он меньше заданного расхождения
	 return 1 ; @error остается в 0
 Else
	 SetError(1) ; а если больше - ставлю @error 
EndIf

...

_WinAPI_ReleaseDC($hWnd, $hDC)


Ну и результаты в скрине


Расшифрую - сначала идет дистанция распознанная через DC, потом (dist std) через стандартную функцию PixelSearch, time - среднее время выполнения по 10 циклам, time min/max - минимальное и максимальное, 1 -DC, 2- PixelSearch.

Как видим результат неутешителен, функция работающая через DC проигрывает 55% производительности.
Если есть вопросы или видите какие-то грубые ошибки - пишите.

P.S. Ради интереса проверил еще зависимость выполнения от приоритета процесса, с нормальным приоритетом время выполнения увеличилось вдвое. Реалтайм тоже показал себя плохо, из чего делаем вывод, что менять приоритет на процессороемкие функции можно и нужно, но выбирать между 3 и 4 (3 - Above Normal 4 - High).

P.P.S. А все же время распознания 12 строчек овервью порадовало. Особенно минимальное у PixelSearch. 57 мс.

UP Курил-курил справку, нашел еще функцию
Код:
DllOpen
, поставив ее вначале скрипта, и после подсовывая указатель в DllCall улучшил результат до сравнимого с PixelSearch. Но тем не менее, побить Пикселсерч пока не могу.)
Конфиг машины Q8300, Asus Commando, 6Gb Ram, GTS 250, win7 64

Затерлось время макс - 85.16
 

Enemy

Знающий
Сообщения
42
Репутация
7
Скажите, а чем вы пользуетесь для определения дистанции?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Логично предположить что пиксельсерчем... Тока тогда возникает вопрос, чем пользуется пиксельсерч если не апишными функциями? ScanLine или что там в апи ищет пиксель.
 
Автор
M

mornere

Знающий
Сообщения
22
Репутация
8
Enemy сказал(а):
Скажите, а чем вы пользуетесь для определения дистанции?
Самописным OCR, "сердце" которого уже выкладывал в одной из тем, вроде.
Все цифры занимают одинаковое количество пикселей, расстояния тоже одинаковы (кроме цифры с точкой). Составил "матрицу" ярких пикселей всех цифр, проверкой по одной точке делю на 2 равные группы по 5 цифр, следующей проверкой делю получившуюся на еще 2... и т. д. + вначале 2 проверки определения, что цифра вообще есть (дописал после, по уму надо интегрировать в проверку). Написал за 3 или 4 дня в праздники :smile: Ну дальше самое простое, из цифр в цикле собираю число.

Belfigor сказал(а):
Логично предположить что пиксельсерчем... Тока тогда возникает вопрос, чем пользуется пиксельсерч если не апишными функциями? ScanLine или что там в апи ищет пиксель.
Протестил единичный гетпиксель+побитовый AND против единичного Пикселсерча. Разницы во времени почти нет,гетпиксел чууть быстрее. Только гетпиксел быстрее на треть. Пикселсерч вырос в моих глазах.

P.S. Тут высказали мысль - может косяк в подгрузке ДЛЛ и прочем. поэтому долго.
 

Enemy

Знающий
Сообщения
42
Репутация
7
mornere сказал(а):
Enemy сказал(а):
Скажите, а чем вы пользуетесь для определения дистанции?
Самописным OCR, "сердце" которого уже выкладывал в одной из тем, вроде.
Все цифры занимают одинаковое количество пикселей, расстояния тоже одинаковы (кроме цифры с точкой). Составил "матрицу" ярких пикселей всех цифр, проверкой по одной точке делю на 2 равные группы по 5 цифр, следующей проверкой делю получившуюся на еще 2... и т. д. + вначале 2 проверки определения, что цифра вообще есть (дописал после, по уму надо интегрировать в проверку). Написал за 3 или 4 дня в праздники :smile: Ну дальше самое простое, из цифр в цикле собираю число.
http://autoit-script.ru/index.php?topic=4316.0 - оно?
 

Insari

Осваивающий
Сообщения
34
Репутация
35
Редактированная версия
Интересная и полезная работа проделана автором.
 
Автор
M

mornere

Знающий
Сообщения
22
Репутация
8
Insari сказал(а):
Выложи весь скрипт.
Тогда можно будет по единообразному начальному материалу протестировать различные варианты.
Заодно и сравнить шустрость на разных по мощности машинах можно будет.
Извините, но выкладывать рабочий OCR, да еще и практически готовым модулем я не стану. Хватит и того, что я выложил его главную часть, для которой надо только написать интерфейс. Если желаете сравнить - пожалуйста, функция вызова из длл тут есть, заменяете ею PS и сравниваете быстродействие любого своего участка кода, если найдете способ вызывать её быстрее - буду очень признателен. Тем более, что протестить на разных машинах могу и сам, будет время - выложу тест на ВМ и на мощном компе. А так интереса по быстродействию скрипт не представляет, алгоритм с DC отличается только теми строчками, которые я выложил (они заменяют PixelSearch).
 
Автор
M

mornere

Знающий
Сообщения
22
Репутация
8
Нашел способ почти сравняться с Pixelsearch, занес в первый пост.
 

Insari

Осваивающий
Сообщения
34
Репутация
35
Редактированная версия
Код:
Func other($max_X=100, $max_Y=500)
	Local $hDC = _WinAPI_GetDC($hWnd)
	Local $dll = DllOpen('gdi32.dll')
	Local $Timer = TimerInit()
	Local $j = 0
	For $x = 1 To $max_X
		For $y = 1 To $max_Y
			$j += 1
			$ColGet=DllCall($dll, 'dword', 'GetPixel', 'hwnd', $hDC, 'int', $x, 'int', $y) ;получаю цвет
			Local $lay = BitAND($ColGet[0], 0x0000FF) ; беру только 1 слой для сравнения
		Next
	Next
	ConsoleWrite('Таймер: '& TimerDiff($Timer) & @CR)
	ConsoleWrite('Пройдено ' & $j & ' точек' & @CR)
_WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc


При выполнении вышеприведенного кода, я получил проход через 50000 точек (1 слой для сравнения) за 3800 мс (округляя в среднем).
При выполнении "некого секретного кода", также проходящего через 50000 точек (1 слой для сравнения), я получил несколько меньше.

Спасибо автору за проделанную им работу, на пользу всего нашего сообщества.
 
Автор
M

mornere

Знающий
Сообщения
22
Репутация
8
Insari сказал(а):
Лишая возможности говорить на языке одного примера для тестирования, автор данного топика, по моему, не совсем прав (учитывая заявленную тему).
Никто не "вырывает" клещами секретные области Вашего бота, просто дополнительно к столь успешно решаемой Вами задаче, предложите пример не имеющий столь выраженный значимый характер.
На основании бы этого полного примера, мы бы (все кто заинтересовался Вашей исследовательской работой) по тестировали, покурили бы то и это, глядишь, что и сладилось бы.

Так не было предложения "создай тестовый скрипт и выложи". Было предложение "Выложи весь скрипт". Каков вопрос - таков ответ.
Кто же против? Накидаю в выходные тестовый скрипт и дружно потестим.


Insari сказал(а):
...
При выполнении вышеприведенного кода, я получил проход через 50000 точек (1 слой для сравнения) за 3800 мс (округляя в среднем).
При выполнении "некого секретного кода", также проходящего через 50000 точек (1 слой для сравнения), я получил 160 мс (в среднем).

Наверняка копируя изображение в битмап и работая с ним? Точнее, я полагаю, нужного куска изображения.
Тогда вопрос про вызов для выборочной проверки цвета слоя.
типа
Код:
For $x = 1 To 200
            $ColGet=DllCall($dll, 'dword', 'GetPixel', 'hwnd', $hDC, 'int', Random(1,$max_x,1), 'int', Random(1,$max_y,1)) 
            Local $lay = BitAND($ColGet[0], 0x0000FF)
    Next

Насколько будет отличаться скорость? Вообще естественно, что доступ к памяти будет быстрее, чем получение по пикселю. Но сразу вопрос, если это работа с битмапом, то сколько займет копирование области (пусть той же из примера 100*500) + удаление после обработки?
 

Insari

Осваивающий
Сообщения
34
Репутация
35
Редактированная версия :smile:
Абсолютно верно, работа с битмапом.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
В последнее время у нас на форуме полявилось как минимум 2 талантливых разработчика. Вы не поверите, но это не ирония. Я действительно горжусь тем что помимо большинства нахлебников на форуме появляются действительно желающие делиться своими достижениями люди, НО:

Делиться хорошо, но все же делиться надо уметь в меру. Я ничего против не имею если вы выкладываете свои даже примеры, но таки рабочие, в которых веет ветер новых технологий, но господа, незабываем что цель раздела не дать рыбу, а дать удочку, просто наставить на путь истинный, поэтому выкладывая свои достижения убедительная просьба урезать их, как в коде так и в подробностях пояснений.

Так же не стоит забывать что ева - это не WoW не La2 и не Aion и не прочая ммо шелуха. У нас 1 сервер. У нас нет риалмов. Мы играем в десятки тысяч человек в одном месте. Действие каждого из нас может так или иначе отразиться на любом другом игроке этого мира. Особенно это касается ботоводов выкладывающих на публику свои творения, ибо даже "пошевелить мизинцем" для бот девелопера равносильно нескольким годам упорного труда 99.99% игроков евы, упоротых хомячков. Совершенству нет предела, никто не спорит. Но есть придел общедоступному совершенству. Выкладывая в общий доступ все более и более навороченные технологии или просто даже упоминания о возможности их использования, вы рождаете в своей же среде личностей именуемых Личами. Которые ничего не дают, а только пользуются чужими идеями и достижениями. Делясь чем-либо вы рождаете себе потенциального врага в мире EVE. Оформляя каждый ответ или любой другой совет, вы должны понимать что есть лимит дозволенного. В частности этим лимитом являются именно OCR технологии распознавания текста и образов с экрана которые были ранее признанны табу на этом форуме. Не говоря уже о способах их оптимизации и реализации максимального быстродействия.

Настоятельно рекомендую вам до конца воскресенья отредактировать все ваши темы и сообщения которые вы постили за последнюю неделю касаемо OCR и технологий их реализации, упростить их и примеры к ним приложенные. Если пример нельзя упростить то полностью удалить упоминание о нем. В противном случае оно будет отредактировано мною.

Не забываем, мы ходим по лезвию ножа публикуя в общий доступ свои разработки и результаты исследований. Надо оставить хоть что-то на самоподготовку будущим великим ботоводам. Иначе на корню убивается вся идея проекта.
 

Insari

Осваивающий
Сообщения
34
Репутация
35
В принципе я согласен с Belfigor'ом по поводу разницы умения ловить рыбу и её пожиранием, поэтому предпочту сконцентрироваться на предоставлении "инструментов разработчика".
Если же кто проявит желание проанализировать их "язык", то мне кажется это вполне заслуженная награда по рыболовству :smile:.
 

DJ_Tommy

Продвинутый
Сообщения
236
Репутация
57
Belfigor
Здесь нет практически ничего, что само по себе приводи к победе. Предлагаю все оставить как есть.
 

Raytraycer

Новичок
Сообщения
1
Репутация
0
Здесь действительно нет ничего, приводящего к победе. Клиент евы уже раскололи и есть методы считывания значений прямо из памяти. Я еще не допер как это сделать, но боты такого уровня легко гуглятся. С удовольствием бы переписал весь свой выводок пиксель-ботов на новый метод, все таки они необоснованно трудозатратны для обслуживания и разработки.
 
Автор
M

mornere

Знающий
Сообщения
22
Репутация
8
Enemy сказал(а):
Вашего там нет :smile: не поделитесь?

Было моё, да сплыло.Раз уж я согласился с уважаемым Belfigor'ом насчет OCR, то остается Вам написать его самому. Общий алгоритм я описал, будут вопросы - спрашивайте, постараюсь помочь.

Raytraycer сказал(а):
Здесь действительно нет ничего, приводящего к победе. Клиент евы уже раскололи и есть методы считывания значений прямо из памяти. Я еще не допер как это сделать, но боты такого уровня легко гуглятся. С удовольствием бы переписал весь свой выводок пиксель-ботов на новый метод, все таки они необоснованно трудозатратны для обслуживания и разработки.

Да методы известные. Скачайте Артмани, и если сможете читать там значения - полдела сделано. Но! OCR боты по мне интереснее, безопаснее и больше похожи на людей.
 

Enemy

Знающий
Сообщения
42
Репутация
7
собственно вопрос, непонятен сам алгоритм работы.
допусти есть значение: "1113 м"
Идет сравнение ближайших пикселей цифры или буквы?
Или они различаются как-то в одном пикселе?
 
Автор
M

mornere

Знающий
Сообщения
22
Репутация
8
Enemy сказал(а):
собственно вопрос, непонятен сам алгоритм работы.
допусти есть значение: "1113 м"
Идет сравнение ближайших пикселей цифры или буквы?
Или они различаются как-то в одном пикселе?
OffTopic:

Давайте тогда для начала введем немного теории. OCR - optical character recognition (система оптического распознавания символов) - это система электронного перевода печатного или рукописного (в нашем случае экранного) текста из картинки в "текст" который способен воспринимать компьютер.
Сложные движки используют алгоритмы преобразований, тут есть несколько путей, можно "вычистить" букву от шумов, усреднить толщину линий и распознать "вылизанную" букву по шаблону. Можно вычислить контур буквы, и по неким признакам (например буква "ш" состоит из 3 вертикальных палок и соединяющей внизу горизонтальной) распознать букву. Все это есть в гугле
Если нужно распознать всего несколько цифр (букв), проще использовать первый способ. Так как клиент скармливает нам цифры в почти готовом виде, нужно только:
а) составить характерный для цифры шаблон (не обязательно проверять все пиксели)
б) добиться уникальности шаблона. Т.е. чтобы цифры распознавались компом однозначно.

Поставьте себе задачу - игра в морской бой, только попадания попиксельно вслепую по цифрам и "убит" - это однозначно распознанная цифра.



По теме. За выходные не успел набросать скрипт тестовый, прошу прощения у всех заинтересованных. Исправлюсь в ближайшее время.
 
Верх