Author Topic: В чем проблема...?  (Read 8458 times)

0 Members and 4 Guests are viewing this topic.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
В чем проблема...?
« on: October 14, 2016, 09:17:04 PM »
Ребят, знаю, что Clickermann написан на Delphi. Этот код:
Code: (clickermann) [Select]
$x1=633
$y1=243
$x2=811
$y2=382

$ms = $_ms
GETSCREEN

FOR($y=$y1,$y<$y2+1)
   FOR($x=$x1,$x<$x2+1)
      $color = pxl($x,$y)
      IF($color = 16777215)
         PXLREPLACE($x,$y,$x,$y,$color,8372223)
      END_IF
      IF($color ! 11368191)
         PXLREPLACE($x,$y,$x,$y,$color,0)
      END_IF
   END_CYC
END_CYC

SCREENSHOTFIX(0,0, $_xmax,$_ymax, "OutScreen.bmp", 0)
LOGWRITE ($_ms-$ms)

HALT
реализуется за 10218 миллисекунды... Может я туплю в чем-то... Как ускорить процесс? Если написать на той же delphi прогу, которая будет делать то же самое и выдавать такой же скрин (один в один), то вся операция занимает всего 46 миллисекунд. Может какой-то другой алгоритм в Clickermann нужно прописывать...?
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: В чем проблема...?
« Reply #1 on: October 14, 2016, 09:54:49 PM »
Или хотя бы как подгрузить в буфер Clickermann-а картинку не с экрана, а из файла? Ну, чтоб сам экран сканила другая прога, а кликер искал нужную картинку не на экране, а на картинке из файла.
« Last Edit: October 15, 2016, 01:24:43 AM by Hito »
Я не ду... Потому и не бу...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: В чем проблема...?
« Reply #2 on: October 15, 2016, 09:21:36 AM »
Причем тут Delphi, кликер интерпретирует скрипт в исполняемые команды и тратит на это массу времени и ресурсов.

Судя по скрипту ускорять там нечего. И кликере нет возможности взять картинку в графический буфер из файла.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: В чем проблема...?
« Reply #3 on: October 15, 2016, 11:07:42 AM »
кликер интерпретирует скрипт в исполняемые команды

Неужели более 10-ти секунд уходит только на то, чтобы машина перевела скрипт в несколько строк, с одного языка на другой...? Тут в чем-то другом дело... В delphi-ж я тоже не на двоичном языке пишу... Однако в той проге на все операции уходит в 200 с лишним раз меньше времени... Только поймите правильно пожалуйста - я не пытаюсь сейчас дуться, как "мудрый карась". Просто реально заставила задуматься разница.
Я не ду... Потому и не бу...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: В чем проблема...?
« Reply #4 on: October 15, 2016, 11:35:16 AM »
10 секунд это еще быстро. У меня выполнение твоего скрипта вообще заняло 43755 мс.  ::)

Вот так на секунду быстрее отработал.
Code: (clickermann) [Select]
$x1=633
$y1=243
$x2=811
$y2=382

$ms = $_ms
GETSCREEN

FOR($y=$y1,$y<$y2+1)
   FOR($x=$x1,$x<$x2+1)
      $color = pxl($x,$y)
      IF($color = 16777215)
         PXLREPLACE($x,$y,$x,$y,$color,8372223)
      ELSE
         IF($color ! 11368191)
            PXLREPLACE($x,$y,$x,$y,$color,0)
         END_IF
      END_IF
   END_CYC
END_CYC

SCREENSHOTFIX(0,0, $_xmax,$_ymax, "OutScreen.bmp", 0)
LOGWRITE ($_ms-$ms)

HALT

Кстати не понятно,
IF($color = 16777215) допустим условие верно и сработало, произошла замена цвета
IF($color ! 11368191) но следующее условие тоже будет верным и снова цвет будет переписан :o В чем смысл?
« Last Edit: October 15, 2016, 11:45:12 AM by Oraven »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: В чем проблема...?
« Reply #5 on: October 15, 2016, 11:44:13 AM »
10 секунд это еще быстро. У меня выполнение твоего скрипта вообще заняло 43755 мс.  ::)
у меня он 20 сек отрабатывает  :D .
дело в том, что можно схитроить, и не менять каждый пиксель поочереди, а запомнить координаты белых и розовых, а потом поместить их на место с заменой белого на оранжевый. выполнение ускориться значительно, но только если количество тех самых белых и розовых пикселей не велико.
Code: (clickermann) [Select]
$x1=633
$y1=243
$x2=811
$y2=382


$ms = $_ms
GETSCREEN

SCANPXL($orange, $x1, $y1, $x2, $y2, 16777215)  //запоминаем все координаты с белыми пикселями
SCANPXL($pink, $x1, $y1, $x2, $y2, 11368191)  //запоминаем все координаты с розовыми пикселями

COLORMODE(8,$x1, $y1, $x2, $y2)          //делаем нашу область черной
PXLREPLACE($x1, $y1, $x2, $y2,16777215,0)

$size=ARRSIZE($orange)-1
FOR($a=0,$a<$size)
PXLREPLACE($orange[$a],$orange[$a+1],$orange[$a],$orange[$a+1],0,8372223)//отрисовываем заново все оражевые, вместо белых
END_CYC
$size=ARRSIZE($pink)-1
FOR($a=0,$a<$size)
PXLREPLACE($pink[$a],$pink[$a+1],$pink[$a],$pink[$a+1],0,11368191)  //отрисовываем заново все розовые
END_CYC


SCREENSHOTFIX(0,0, $_xmax,$_ymax, "OutScreen.bmp", 0)
LOGWRITE ($_ms-$ms)
halt

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: В чем проблема...?
« Reply #6 on: October 15, 2016, 11:50:38 AM »
У меня выполнение твоего скрипта вообще заняло 43755 мс.  ::)
У меня просто Core-i7  ;)
В чем смысл?
Нужно один цвет получить. Даже если их там два.
Я тут еще и цвет спутал... Вместо 11368191, 8372223.
Просто там стрелка белая закрашивается другим цветом постепенно. Заготавливать уйму скринов с разной степенью закраски - сам понимаешь... А так закрасил ее сразу одним цветом и сверил с одним скрином.

Я сегодня набросаю маленькую прогу и скину - попробуешь разницу. Тоже наверное задумаешься...
« Last Edit: October 15, 2016, 01:06:43 PM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: В чем проблема...?
« Reply #7 on: October 15, 2016, 11:55:28 AM »
можно схитроить
Мне кажется хитрость замороченная )) А выигрывает не много.
Я не ду... Потому и не бу...

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: В чем проблема...?
« Reply #8 on: October 15, 2016, 12:04:11 PM »
Quote
выполнение ускориться значительно, но только если количество тех самых белых и розовых пикселей не велико.
я проверял на рабочем столе, где белые пиксели это только названия ярлыков (их не много)  - выполнение 485мс . да, если у тебя на в области количество белых пикселей больше половины, то разница не ощутима.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: В чем проблема...?
« Reply #9 on: October 15, 2016, 12:11:41 PM »
да, если у тебя на в области количество белых пикселей больше половины, то разница не ощутима.
Для меня любая разница не особо ощутима, если весь процесс занимает более 50 мс. Мне просто две такие области закрашивать нужно и с поиском пяти цветов в этих областях. А потом еще сравнивать заготовленные картинки с этими областями (их больше 15-ти). И все это нужно делать быстро...

P.S. - Чую, чтобы пройти эту игру, мне придется самому кликер писать под нее...
« Last Edit: October 15, 2016, 01:17:51 PM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: В чем проблема...?
« Reply #10 on: October 15, 2016, 12:47:47 PM »
В общем вот программку набросал http://www.fayloobmennik.net/6636343
А вот образец картинки для работы http://www.fayloobmennik.net/6636320
Программка создаст папку для скринов и будет сохранять скрины в нее. На верхние три параметра можете не обращать внимания (это мне для работы). С координатами и цветом сами все поймете. Если не ставить галочку на чекбоксе, то прога сделает скрин всего экрана, на котором найдет цвет в заданных координатах и закрасит остальные цвета. После этого сохранит весь скрин. Если галочку поставить, то скрин будет сделан только обработанной области. Ну тоже заморочка для меня. В общем попробуйте без галочки и попробуйте сделать то же самое кликером и ощутите разницу...

Ааа! Забыл  ;D Активируется все это дело по (Ctrl+F1)  :)
Там горячие клавиши зареганы и прога сработает в свернутом виде.

У меня выполнение твоего скрипта вообще заняло 43755 мс.  ::)
Прогой быстро? Я там таймер не поставил, но на глаз разница видна?
Могу в принципе таймер впихнуть. Все спешу просто... Голова у меня просто пухнет постоянно от всего этого ))
« Last Edit: October 15, 2016, 01:37:59 PM by Hito »
Я не ду... Потому и не бу...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: В чем проблема...?
« Reply #11 on: October 15, 2016, 01:50:50 PM »
Прогой быстро?

Быстро, меньше секунды. Запускаю, тутже "тадам" и все скрин готов.


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: В чем проблема...?
« Reply #12 on: October 15, 2016, 01:58:02 PM »
Прогой быстро?

Быстро, меньше секунды. Запускаю, тутже "тадам" и все скрин готов.
Ну вот... Вот с таймером http://www.fayloobmennik.net/6636385 Побольше чуток получилось правда... - 75 мс у меня. Нужно подшаманить. Но все же... Кликер получается по каким-то другим своим внутренним алгоритмам все это делает...? В проге я использую практически тот же алгоритм, что и в скрипте кликера. Тоже перебираю по очереди пиксели в заданной области и сверяю. А вот какой алгоритм для этого использует сам кликер, на основе скрипта...? Но это только Джони известно...
« Last Edit: October 15, 2016, 02:05:13 PM by Hito »
Я не ду... Потому и не бу...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: В чем проблема...?
« Reply #13 on: October 15, 2016, 02:32:42 PM »
А кто тебе сказал, что он переводит с псевдобейсика на делфи?
Он тупо интерпретирует построчно запоминая точки переходов в циклах и подпрограммах.
Каждая итерация фор (а они ещё и вложенные) интерпретируется заново. Наверно. К тому же код на делфи при компиляции стал хоть и замусоренным, но ассемблером. Пусть и не везде таким оптимальным как на чистом асм. А псевдокод скрипта КМ уже ни чем не стал и проходит двойную обработку.

Всё это в угоду универсальности команд и функций которых нет напрямую в делфи. Всё можно оптимизировать и даже не один раз. Но на это нужно время и стимул.

Как говорил Джонни, он начинает писать делфи на делфи. В чём тогда смысл?


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: В чем проблема...?
« Reply #14 on: October 15, 2016, 02:41:03 PM »
А кто тебе сказал, что он переводит с псевдобейсика на делфи?
Он тупо интерпретирует построчно запоминая точки переходов в циклах и подпрограммах.
Каждая итерация фор (а они ещё и вложенные) интерпретируется заново. Наверно. К тому же код на делфи при компиляции стал хоть и замусоренным, но ассемблером. Пусть и не везде таким оптимальным как на чистом асм. А псевдокод скрипта КМ уже ни чем не стал и проходит двойную обработку.

Всё это в угоду универсальности команд и функций которых нет напрямую в делфи. Всё можно оптимизировать и даже не один раз. Но на это нужно время и стимул.

Как говорил Джонни, он начинает писать делфи на делфи. В чём тогда смысл?
Ты прости, но я ничего не понял из сказанного... Это не твой минус - мой ) Но уж так уж есть...
Я не ду... Потому и не бу...