Author Topic: Как ускорить скрипт ?  (Read 9944 times)

0 Members and 1 Guest are viewing this topic.

BuP4uk

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Как ускорить скрипт ?
« on: December 03, 2014, 11:36:05 AM »
написал скрипт, все работает, но возник вопрос, возможно ли ускорить действие кликера при появление нужного мне окна?
Вот появились у меня награды за бой и с низу кнопка вернуться к списку уровней, вот хотелось бы чтобы он через 1-2 секунды уже нажимал эту кнопку а не спустя 10 как он делает

Code: (clickermann) [Select]
//скрипт на фарм greyish snowfield с запуска blueastacks  с разрешением 1600х900


//запускаем summon masters
getscreen
if_picture_in(0,0,1600,900, "bstack.bmp")
logwrite(запускаемся)
LCLICK(320,154)
wait(1)
end_if

//обходим рекламу если есть
if_picture_in(0,0,1600,900, "reklama.bmp")
logwrite(выключаем_рекламу)
LCLICK(1171,856)
wait(1)
LCLICK(1396,75)
wait(1)
end_if

//выходим в меню если всетаки прошел по ссылке рекламы
if_picture_in(0,0,1600,900, "browser.bmp")
logwrite(обходим_рекламу)
LCLICK(125,900)
wait(2)
end_if

//входим в игру
if_picture_in(0,0,1600,900, "logo.bmp")
logwrite(входим_в_игру)
wait(4)
LCLICK(879,800)
wait(2)
end_if

//закрываем новости
if_picture_in(0,0,1600,900, "news.bmp")
logwrite(закрываем_новости)
LCLICK(1408,122)
wait(2)
end_if

//заходим в ящик
if_picture_in(0,0,1600,900, "main.bmp")
logwrite(заходим_в_ящик)
LCLICK(128,666)
wait(2)
end_if

//покидаем ящик и запускаем explorer
if_picture_in(0,0,1600,900, "leavebox.bmp")
logwrite(выходим_и_идем_в_эксплорер)
LCLICK(1509,662)
wait(15)
LCLICK(1522,777)
wait(15)
LCLICK(1430,160)
wait(2)
end_if

//выбираем експлор
if_picture_in(0,0,1600,900, "explorer.bmp")
logwrite(выбираем_експлор)
LCLICK(1431,216)
wait(2)
end_if

//выбираем хелл
if_picture_in(0,0,1600,900, "hell.bmp")
logwrite(выбираем_хел_режим)
LCLICK(1543,373)
wait(2)
end_if

//ищем греиш сноуфилд
if_picture_in(0,0,1600,900, "hell2.bmp")
logwrite(ищем_greyish_snowfield)
move(400,400)
wait(1)
wheeldown
wait(4)
wheeldown
wait(4)
wheeldown
wait(4)
wheeldown
wait(4)
LCLICK(301,133)
wait(2)
end_if

//выбираем 2 уровень
if_picture_in(0,0,1073,240, "gs6.bmp")
logwrite(выбераем_второй_уровень)
move(837,516)
wait(1)
wheeldown
wait(3)
wheeldown
wait(3)
LCLICK(827,632)
wait(2)
end_if

//выбираем 2 уровень
if_picture_in(0,0,1600,900, "gs2.bmp")
logwrite(выбераем_второй_уровень)
LCLICK(827,632)
wait(2)
end_if

//выбираем хелпера
if_picture_in(0,0,1600,900, "helper.bmp")
logwrite(выбераем_третьего_хелпера)
LCLICK(803,569)
wait(2)
LCLICK(1154,585)
wait(2)
end_if

//запускаем автобой
if_picture_in(0,0,1600,900, "auto.bmp")
logwrite(запускаем_автобой)
LCLICK(1395,161)
wait(2)
end_if

//забираем награду
if_picture_in(0,0,1600,900, "reward.bmp")
logwrite(возвращаемся_к_выбору_уровня)
LCLICK(1522,777)
wait(20)
end_if

//закончилась энергия
if_picture_in(0,0,1600,900, "ap.bmp")
logwrite(возвращаемся_в_главное_меню(AP<2))
LCLICK(1054,616)
wait(2)
end_if

//нет места в инвентаре
if_picture_in(0,0,1600,900, "inventoryfull.bmp")
logwrite(возвращаемся_в_главное_меню(нет_места))
LCLICK(829,615)
wait(2)
end_if

//нет места в инвентаре2
if_picture_in(0,0,1600,900, "inventoryfull2.bmp")
logwrite(возвращаемся_в_главное_меню(нет_места))
LCLICK(811,607)
wait(2)
LCLICK(51,433)
wait(2)
end_if

//дисконнект
if_picture_in(0,0,1600,900, "disconnect.bmp")
logwrite(перезаходим)
LCLICK(817,601)
wait(2)
end_if

//ежедневный_бонус
if_picture_in(0,0,1600,900, "daylybonus.bmp")
logwrite(забираем_ежедневный_бонус)
LCLICK(864,713)
wait(2)
end_if

//застрял в меню усиления оружия/персонажей
if_picture_in(0,0,1600,900, "zastryal2.bmp")
logwrite(выходим_из_меню_усилений)
LCLICK(1524,781)
wait(2)
end_if

//закрываем тимвивер
if_picture_in(0,0,1600,900, "teamweaver.bmp")
logwrite(закрываем_тимвивер)
LCLICK(1123,581)
wait(2)
end_if

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Как ускорить скрипт ?
« Reply #1 on: December 03, 2014, 12:10:53 PM »
Строки нужно заключать в кавычки
Code: (clickermann) [Select]
logwrite("запускаемся")
Также рекомендую добавить getscreen в конце каждого условия поиска. Чтобы следующее условие получило обновленный скриншот, а не искало по старому скрину сделанному 10 секунд назад.

На счет кода, вставь GOTO чтобы в зависимости от результата прыгнуть в нужную часть скрипта.

Code: (clickermann) [Select]
getscreen
if_picture_in(0,0,1600,900, "bstack.bmp")
   logwrite("запускаемся")
   LCLICK(320,154)
   wait(1)
   getscreen // делаем новый снимок
end_if

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Как ускорить скрипт ?
« Reply #2 on: December 03, 2014, 02:17:27 PM »
как ты себе представляешь нулевой пиксель?
Если упрешь курсор в верхний левый угол получишь координату 0,0

BuP4uk

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Как ускорить скрипт ?
« Reply #3 on: December 03, 2014, 03:34:00 PM »
Как то не логично поиск картинки всегда ведётся  в общем секторе  0,0,1600,900
а клики при их нахождении всегда в определённый пиксель к примеру; LCLICK(320,154)
Это значит, что картинки возникают в строго определённых местах  и поиск можно ускорить значительно сузив размер сектора, персонально для каждой картинки. к примеру для
if_picture_in(220,0,420,254, "bstack.bmp")
LCLICK(320,154)
это 100 пикселей в каждую сторону от клика, но это примерно так как незнаю размера картинок( подразумевается, что они маленькие)

если клики по картинкам, то почему не использовать результат их нахождения? 
  LCLICK  ($_return1,$_return2) везде а не прописывать персонально каждый пиксель

//скрипт на фарм greyish snowfield с запуска blueastacks  с разрешением 1600х900
а почему бу не сделать его на любое разрешение?
if_picture_in(1,1,$_xmaх,$_ymax, "bstack.bmp")
как ты сабе представляешь нулевой пиксель?

клики не по картинкам(кнопка возврата везде одинаковая,а мне ее нужно использовать не всегда), сократить сектор можно(просто не был уверен что это ускорит процесс),
если поставить разрешение екрана больше/меньше изменится вид искомой картинки(сузится)
за идею спасибо. так понимаю если и картинки сделать 10х10 пикселей еще шустрей начнет ?сейчас используются все 50х50...

BuP4uk

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Как ускорить скрипт ?
« Reply #4 on: December 03, 2014, 03:36:52 PM »
Строки нужно заключать в кавычки
Code: (clickermann) [Select]
logwrite("запускаемся")
Также рекомендую добавить getscreen в конце каждого условия поиска. Чтобы следующее условие получило обновленный скриншот, а не искало по старому скрину сделанному 10 секунд назад.

На счет кода, вставь GOTO чтобы в зависимости от результата прыгнуть в нужную часть скрипта.

Code: (clickermann) [Select]
getscreen
if_picture_in(0,0,1600,900, "bstack.bmp")
   logwrite("запускаемся")
   LCLICK(320,154)
   wait(1)
   getscreen // делаем новый снимок
end_if

а вот тут проблема, снимок может не успеть обновиться, так как после клика бывают задержки в плоть до 20 секунд в зависимости от соединения...
м... без ковычек отображается нормально что делает, время это врятли сократит...
« Last Edit: December 03, 2014, 03:51:00 PM by BuP4uk »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Как ускорить скрипт ?
« Reply #5 on: December 03, 2014, 04:37:01 PM »
а вот тут проблема, снимок может не успеть обновиться, так как после клика бывают задержки в плоть до 20 секунд в зависимости от соединения...
м... без ковычек отображается нормально что делает, время это врятли сократит...

Воспользуййся циклом для ожидания картинки
Code: (clickermann) [Select]
// бесконечное ожидание картинки
$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
      $check = 1
      LCLICK($_return1, $_return2)
      WAITMS(100)
   ELSE
      WAITMS(50)
   END_IF
END_CYC

Code: (clickermann) [Select]
// Не бесконечное ожидание
$time = $_time_t + 30 // таймер на 30 секунд
WHILE($time > $_time_t)
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
      $time = 0
      LCLICK($_return1, $_return2)
      WAITMS(100)
   ELSE
      WAITMS(500)
   END_IF
END_CYC
IF($time ! 0)
// время истекло, картинка не найдена
END_IF

ezfalcon

  • Освоившийся
  • **
  • Posts: 30
    • View Profile
Re: Как ускорить скрипт ?
« Reply #6 on: January 29, 2015, 01:35:45 AM »
написал скрипт, все работает, но возник вопрос, возможно ли ускорить действие кликера при появление нужного мне окна?
Вот появились у меня награды за бой и с низу кнопка вернуться к списку уровней, вот хотелось бы чтобы он через 1-2 секунды уже нажимал эту кнопку а не спустя 10 как он делает

У тебя каждая проверка вносит задержку в работу сценария, таким образом чем больше у тебя будет проверок, тем дольше будет выполняться 1 проход сценария

Также многие условия наверняка взаимоисключаемы, т.е., если сработало первое условие, то не имеет смысла проверять все остальные

Рекомендую переделать скрипт следующим образом: создать дерево условий, где все взаимоисключающие ситуации будут находиться в ELSE,
во все блоках IF, вместо LCLICK($x,$y)/wait($s) , присваивай некоторой переменной значение, которое будет означать то или иное действие,
после всех блоков с анализом экрана добавь блок switch, в котором будет выполняться соотв. действие для каждой ситуации:

Code: (clickermann) [Select]
logclear
logshow(1)

// флаги состояния игры
// по идее это должны быть константы, определенные через #, их тогда можно использовать в
// блоках switch, например: case(#REKLAMA), но определение констант в сценарии пока не реализовано насколько знаю
$BSTACK = 1
$REKLAMA = 2
$BROWSER = 3
$LOGO = 4
$UNKNOWN = -1

// состояние игры
$state = $UNKNOWN

// счетчик неопределенных подряд состояний
$unknown_count = 0


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

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

// также сами фрагменты должны представлять из себя уникальную последовательность пикселей
// в большинстве ситуаций использую картинки высотой в 1px и длиной около 10px
// здесь просто выставляем на весь экран
$x1 = 0
$y1 = 0
$x2 = $_xmax
$y2 = $_ymax


while(1 = 1)
 
  // для отладки
  print("DEBUG: тик-так")
 
  // по умолчанию состояние не определено
  $state = $UNKNOWN
 
  getscreen
 
  // определяем состояние
  if_picture_in($x1, $y1, $x2, $y2, "bstack.bmp")
    $state = $BSTACK
    $unknown_count = 0
  else
    //обходим рекламу если есть
    if_picture_in($x1, $y1, $x2, $y2, "reklama.bmp")
      $state = $REKLAMA
      $unknown_count = 0
    else
      //выходим в меню если всетаки прошел по ссылке рекламы
      if_picture_in($x1, $y1, $x2, $y2, "browser.bmp")
        $state = $BROWSER
        $unknown_count = 0
      else
        //входим в игру
        if_picture_in($x1, $y1, $x2, $y2, "logo.bmp")
          $state = $LOGO
          $unknown_count = 0
        else
          INC($unknown_count)
        end_if
      end_if
    end_if
  end_if
 
 
 
  // реакция на состояние
  switch($state)
  case(1)
    logwrite("запускаемся")
    LCLICK(320,154)
    wait(1)
  case(2)
    logwrite("выключаем_рекламу")
    LCLICK(1171,856)
    wait(1)
    LCLICK(1396,75)
    wait(1)
  case(3)
    logwrite("обходим_рекламу")
    LCLICK(125,900)
    wait(2)
  case(4)
    logwrite("входим_в_игру")
    wait(2)
    LCLICK(879,800)
    wait(2)
  default
    logwrite("неизвестное состояние:", $unknown_count)
    if ($unknown_count > 4)
      logwrite("определить состояние так и не удалось, завершение работы")
      goto(the_end)
    end_if
    wait(2)
  end_switch
 
  // разгружаем процессор
  waitms(50)
 
end_cyc

the_end:
halt
« Last Edit: February 05, 2015, 01:56:34 PM by ezfalcon »