Author Topic: Новая-старая функция IF_NOT_PIXEL_IN  (Read 13078 times)

0 Members and 3 Guests are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #15 on: August 16, 2017, 10:35:49 AM »
colormode потому быстрый, что там обработка минимальна. Битовый сдвиг вправо на N бит.
Любая другая обработка намного медленней.
Да и colormode быстрый только сейчас. Как я писал на моём старом компе colormode была самая медленная команда. Использовал только на ограниченных областях. На весь экран уходило неприлично много времени для нормального, не тормозного скрипта.


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #16 on: August 16, 2017, 12:42:10 PM »
хотел проверить твой вариант записи в память отсюда http://crapware.aidf.org/forum/index.php?topic=2390.msg23103#msg23103
ты бы точную версию к-мана написал, ато пришлось капаться в памяти для поиска указателя в памяти. ну да ладно, нашел. и, не работает почемуто, меняет только первую строку по Y . следил за памятью - поочередно меняет только первую строку. пока времени нет разбираться, гляну вечером, врядли проблема на моей стороне. перепроверь.
хотел проверить одну из бредовых идей по ускорению данного действия  :D, но не вышло даже запустить твой вариант  :(.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #17 on: August 16, 2017, 01:13:44 PM »
Кликер 4.11. Забыл написать.

Всё работает. Я же по скринам проверял.

Ты там не забыл системные переменные в обычные занести, это как оказалось тоже оптимизирует.
Code: (clickermann) [Select]
$xmax = $_xmax
$ymax = $_ymax
К обычным переменным доступ быстрей.

К коду выше запуск такой:
Code: (clickermann) [Select]
//не забываем вписывать PID кликера после каждого запуска кликера
$pid = 4120

$xmax = $_xmax
$ymax = $_ymax

GETSCREEN
//GREYSCALE(772, 432, 791, 451)
GREYSCALE(750, 426, 849, 525)
SCREENSHOTEX(700,400, 900,550, "Gray_", 0)

HALT




Я бы хотел ускорить запись в AutoIt/ Всё таки он сейчас быстрей в 6.5 раз
« Last Edit: August 16, 2017, 01:15:40 PM by Vint »


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #18 on: August 16, 2017, 04:00:28 PM »
Полез в автоит код переделать, хотел одну идею проверить и увидел как я облажался  ;D :-[
Я там начудил и при переделке на запись строками, чтение вынес за цикл, а запись осталась внутри.
И вместо записи 1 раз на строку оно писало  'длина строки в пикселах' раз, т.е. $x2-$x1 раз  :o

Поправил и получил результат
Quote
100х100   10000 pxl
// PXLREPLACE    8100 ms            0.810 ms/pxl
// +AutiIt             130 ms            0.013 ms/pxl

1600х900  =  15000 ms

В 62 раза быстрее PXLREPLACE! И чем длинее строка, тем разница должна быть больше.
Появился смысл делать контраст.

Попробую ещё один вариант, может ещё ускорю.

P.S. ещё один:
Quote
~118  мс           0.0118 ms/pxl
1600х900  =  11971 ms
Уже разница 68.6 раза.

Вот проект на битбакете https://bitbucket.org/Vintets/cmextend/commits/all  присоединяйся
« Last Edit: August 16, 2017, 05:19:02 PM by Vint »


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #19 on: August 17, 2017, 01:18:11 AM »

Ты там не забыл системные переменные в обычные занести, это как оказалось тоже оптимизирует.
Code: (clickermann) [Select]
$xmax = $_xmax
$ymax = $_ymax

именно в них и была причина.



ну чтож, с автоитом все вышло, здорово, и скорость мега. жаль что я в автоите не силен  :'(, изредка использую в случаях где нужны быстрые вычисления. и при написании в нем - из ушей мозг вытекает. тут еще нужно учитывать, что для каждой версии кликера свой указатель адреса. а так, переписать GREYSCALE на контраст я думаю не составит труда...   тебе  :D


вернемся к моим бредовым идеям. удалось только лишь используя кликер ускорится почти в 3 раза ;D . да, этот результат и рядом не стоит с автоитовским.

суть идеи такова. один кликер использует наши мега компьютеры с дюжинами камней лишь на малый процент всей мощности. у меня вариант GREYSCALE с записью в память нагружает проц всего на 12-14%. при этом участок 100х100 обрабатывается 52-55сек. попробовал разделить нагрузку на несколько экземпляров программы. тоесть один исполняемый кликерман делает скрин и запускает на выполнение определенное количество кликерманов.
Code: (clickermann) [Select]
GETSCREEN(0,0,100,100)

INIWRITE ("speed.ini", "n_win",0)
INIWRITE ("speed.ini","pid",4992)
waitms(10)


$time = $_ms

FOR($a=0,$a<5)
   EXECUTE("speed.cms")
   waitms(120)
END_CYC

WHILE(WNDFIND ("speed")>0)
   waitms(100)
END_CYC

print($_ms - $time,"ms.")

SCREENSHOTEX(0,0, 100,100, "Image_", 0)
halt
а они редактируют память первого.
Code: (clickermann) [Select]
#autorun


$n_win = INIREAD("speed.ini","n_win")+1
INIWRITE ("speed.ini", "n_win",$n_win)

$xmax = $_xmax
$ymax = $_ymax
$pid = INIREAD("speed.ini","pid")


GETSCREEN(($n_win-1)*20,0,($n_win-1)*20+20,100)

GREYSCALE(($n_win-1)*20,0,($n_win-1)*20+20,100)


halt(1)
первый ожидает окончания работы до последнего.... и готово. пару часиков наладки и тестов - и в итоге стало ясно, что если запустить кучу процессов, то все это начинает жутко тупить, и работа замедляется. но, тесты показали, что оптимальное количество к-манов - пять штук. пять процессов (плюс один во главе) смогли нагрузить процессор почти до 80%. время выполнения участка 100х100 уменьшилось до 18-19сек.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #20 on: August 17, 2017, 11:31:30 AM »
ну чтож, с автоитом все вышло, здорово, и скорость мега. жаль что я в автоите не силен  :'(, изредка использую в случаях где нужны быстрые вычисления. и при написании в нем - из ушей мозг вытекает.

Ерунда, я тоже не силён. А писать удобней. Но не так удобно как на питоне.


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


Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #21 on: August 17, 2017, 12:13:20 PM »
Я не вникал особо в код, но не может ли утилитка командной строки NConvert для работы с графикой тут помочь? Батчевый консоль всё-таки рулед. Эт кнешна было б прикольно иметь возможность одним параметром иметь возможность задавать направление сканирование (или же начальную точку, зюйд-вест-ост-норд в форме пар вида sw-ne, для этого понадобится ещё один параметр)).

Почему собсна и предлагают превратить кликер в фотошоп, т. к. в таких заданиях много рутины и их не плохо б автоматизировать. Кстати, краем ухо помню наличие в фотошопе неких капель :) автоматизации и прочих ускоряющих инструментов.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #22 on: August 17, 2017, 01:59:18 PM »
Вот проект на битбакете https://bitbucket.org/Vintets/cmextend/commits/all  присоединяйся
глянул одним глазком вчера, заинтриговал. сегодня уделил немного времени, так запустить и не удалось  ;D . наличие "settings_cme.ini" обязательно? где его взять? или самому писать? очень много информации, дохера чего не понятно, сразу все усвоить не реально.
кстати для работы с памятью всегда использовал библиотеку RMemory.au3 (у меня она так называется, не помню откуда я ее нарыл), на все случаи для работы с памятью.


тут еще нужно учитывать, что для каждой версии кликера свой указатель адреса.
Это я упустил. Сам адрес определять не умею до сих пор.
Нужно доработать, сделать автоопределение версии кликера и использовать для каждой свои адреса. В памяти можно найти версию? или она тоже в разных местах?
перекапал все кликеры которые у меня есть. так и не нашел закономерности в адресах с версией. пока никаких идей нет по определению версии  :'( .
« Last Edit: August 17, 2017, 02:01:31 PM by dramster »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #23 on: August 17, 2017, 03:23:41 PM »
settings_cme.ini там же лежит.


Библиотеку я использую встроенную WinAPI
Много встречал ещё NomadMemory, но посмотрел, она внутри так же вызывает  'kernel32.dll', только структуру каждый раз новую создаёт внутри. 100% будет медленней. NomadMemory - для простоты.


кстати для работы с памятью всегда использовал библиотеку RMemory.au3 (у меня она так называется, не помню откуда я ее нарыл), на все случаи для работы с памятью.
Может здесь http://autoit-script.ru/index.php?topic=20769.msg122696#msg122696


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #24 on: August 17, 2017, 05:46:26 PM »
Ещё вариант. Быстрее
+На всём экране ускорился на 1.1 секунду (отдельная обработка).
Всё итог. Выжал всё что мог. Последний вариант внизу
Quote
// PXLREPLACE  100х100   10000 pxl
// 8100 ms                                0.81 ms/pxl

// 100х100  10000 pxl  ~130  мс           0.013 ms/pxl
// 1600х900           15000  мс
// 100х100  10000 pxl  ~118  мс           0.0118 ms/pxl
// 1600х900           11971  мс
// 100х100  10000 pxl  ~110  мс           0.0110 ms/pxl
// 1600х900           10823  мс
// 100х100  10000 pxl  ~100  мс           0.0100 ms/pxl
// 1600х900           10823  мс

Теперь обработка куска 300х300 должна занимать ~900 ms
« Last Edit: August 17, 2017, 07:08:50 PM by Vint »


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #25 on: August 18, 2017, 11:02:44 PM »
Контраст добавлен.
Наверно добавлю и второй вариант, который красивый контраст делает.
Может для примеров есть наработки? Паттерны значений для облегчения последующего поиска.


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Новая-старая функция IF_NOT_PIXEL_IN
« Reply #26 on: September 05, 2017, 01:12:43 AM »
тест в новой версии.
Code: (clickermann) [Select]
SUB(GREYSCALE_1, $x1, $y1, $x2, $y2)
   FOR($y=$y1,$y<$y2+1)
      FOR($x=$x1,$x<$x2+1)
         $c= pxl($x,$y)
         $gray=int((0.299*colorr($c))+(0.587*colorg($c))+(0.114*colorb($c)))
         PXLREPLACE($x,$y,$x,$y,$c,COLORGEN($gray,$gray,$gray))
      END_CYC
   END_CYC
END_SUB



SUB(GREYSCALE_2, $x1, $y1, $x2, $y2)
   $startbufwr = 0x085D0400  //адрес меняется при запуске
   $place = $x + $x1*4 - $y1*($xmax+1)*4 //сдвиг в нужное место
   
   FOR($y=0, $y < ($y2 - $y1 + 1))
     
      $adrDECwr = $startbufwr - $y*($xmax+1)*4
      FOR($x=0, $x < ($x2 - $x1 + 1))
         $c = PXL($x1+$x, $y1+$y)
         $gray_canal = INT((0.299*COLORR($c)) + (0.587*COLORG($c)) + (0.114*COLORB($c)))
         $gray = COLORGEN($gray_canal, $gray_canal, $gray_canal)
         WRITEMEM($pid, $adrDECwr + $place, $gray, 4)
         
         $adrDECwr = $adrDECwr + 3
         
      END_CYC
   END_CYC
END_SUB

////////////////////////////////////////

$pid = HGETPID (WNDFIND ("Clickermann"))
$xmax = $_xmax
GETSCREEN(100,100,200,200)

wait(1)
$t = $_ms
GREYSCALE_1(100,100,200,200)
print("PXLREPLACE - ", $_ms - $t," ms")
SCREENSHOTEX(0,0, 300,300, "Image_", 0)


wait(1)
$t = $_ms
GREYSCALE_1(100,100,200,200)
print("WRITEMEM - ", $_ms - $t," ms")
SCREENSHOTEX(0,0, 300,300, "Image_", 0)

halt

Code: [Select]
0:53:01 PXLREPLACE - 3743 ms
0:53:06 WRITEMEM - 3632 ms

с буфером какаято неразбериха в новой версии кликера, указателя на него в памяти не нашел. строки в памяти идут с низу в верх (- $y*($xmax+1)*4). и пришлось добавить сдвиг при записи $place . результат WRITEMEM немного даже опередил PXLREPLACE  :D . да и в сравнении с версией 4.12 более чем в 2 раза быстрее.


не по теме:
без параметров GETSCREEN, как то даже неохота тестить вот это "+ Доработка функций граф поиска, небольшое ускорение поиска". особенно если разрешение экрана большое, и изза этого GETSCREEN отрабатывает очень долго. но уже видно, что PXLREPLACE стал значительно быстрее.