вот что вышло

перенос области размером 30х30 у меня занимает 25-30сек. почти вся работа уходит на перевод из десятичного числа в шеснадцатеричное. если бы был попроще способ перевода, то скорость бы выросла до пару десятков милисекунд.
на счет пару десятков мс это я канечно загнул
, но в секунду я думаю можно вложиться.
Решил перенести перевод в GREYSCALE как здесь
http://crapware.aidf.org/forum/index.php?topic=2390.msg14982#msg14982на AutoIt. Там всё таки скорость побольше.
Для начала поразбирался с твоим простым переносом в памяти. Было два образца 10х10 и 30х30 pxl.
Зависимость скорости линейна.
На твоём примере отсюда
у меня показало такое время:
// SCREENin OLD Original
// поканально, старое вычисление HEX = 17.70 ms/pxl
// 30х30 ~16000 мс 17.77 ms/pxl
// 10х10 ~1770 мс 17.70 ms/pxl
У меня , слава богу, не 30 сек получилось. Будем плясать от моей скорости.
Переделав перевод в HEX, добился ускорения на 17%
// SCREENin1 OLD
// поканально, новое вычисление HEX = 14.70 ms/pxl -17%
// 30х30 ~13500 мс, ~13300 мс 14.77 ms/pxl
//SCREENin1(70, 75, 99, 104, 5, 40)
// 10х10 ~1515 мс, ~1470 мс 14.70 ms/pxl
//SCREENin1(70, 75, 79, 84, 5, 40)
Так как данные идут последовательно по пикселам, а не по каналам, решил обходить попиксельно обрабатывая на 1 пикселе сразу все каналы.
В результате этого, чтение цвета (PXL) вызывается в 3 раза реже. И выделив вычисление части адреса отдельно получил такой результат:
// SCREENin2
// один PXL, часть адреса на строку = 13.70 ms/pxl -6.8%
// 30х30 ~12508 мс, ~12345 мс 13.72 ms/pxl
//SCREENin2(70, 75, 99, 104, 5, 40)
// 10х10 ~1370 мс, ~1354 мс 13.70 ms/pxl
//SCREENin2(70, 75, 79, 84, 5, 40)
ещё -6,8%
На следующий день пришла в голову мысль: нафига мы пишем по 1 байту если в пикселе их 4. Что если писать сразу 4. Во столько же раз сократится вычисление адреса при записи и перевод адреса в HEX.
Правда пока додумался что там нужно каналы местами поменять кучу опытов провёл.
// SCREENin3
// попиксельно, Пишем по 4 байта = 5.14 ms/pxl -62.5% !!!
// 30х30 ~4648 мс, ~4620 мс 5.14 ms/pxl
//SCREENin3(70, 75, 99, 104, 5, 40)
// 10х10 ~524 мс, ~518 мс 5.18 ms/pxl
//SCREENin3(70, 75, 79, 84, 5, 40)
Оу, ещё -62.5%
Проба читать тоже из памяти, а не через PXL не увенчалась успехом. Почти в 2 раза медленней преведущего варианта. Ну это и ожидаемо, адресов вычисляем в 2 раза больше.
// SCREENin4 BAD по 2 расчёта HEX адреса
// прямое копирование по 4 байта = 9.48 ms/pxl +84% :((
// 30х30 ~8535 мс 9.48 ms/pxl
//SCREENin4(70, 75, 99, 104, 5, 40)
// 10х10 ~521 мс, ~506 мс 5.06 ms/pxl
//SCREENin3(70, 75, 79, 84, 5, 40)
Плавно переходим сюда:
http://crapware.aidf.org/forum/index.php?topic=2390.msg14982#msg14982P.S. Ах, да, код вот
#name "screen_1.1.6"
// Author: dramster, Vint
// Version: 1.1.6 (10.08.2017)
// Скрипт для Clickermann v4.11 003
#include "..\..\Libs\logger.cms"
// Настройки
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//не забываем вписывать PID кликера после каждого запуска кликера
$pid = 2052
// показывать окно лога. Глубина 0, 1, 2
$log = 1
//##############################################################################
// ====== Подпрограммы =========================================================
SUB(log_show) //=== показ лога ===============================================
IF($log > 0)
LOGSHOW(1, $_xmax-440, 28) // отображение окна лога (335)
WNDSIZE(WNDFIND("Лог", 1), 441, 260) // изменения размеров окна лога 260/800
END_IF
END_SUB
STRSEPARATE("A:B:C:D:E:F", ":", $arr16) //=== перевод числа в HEX. Выход $HEX =
SUB(toHEX, $DEC)
$HEX = ""
WHILE($DEC > 0)
$cel = INT($DEC/16)
$ost = $DEC - $cel*16
IF($ost > 9)
$ost = $arr16[$ost - 10]
END_IF
$HEX = STRCONCAT($ost, $HEX)
$DEC = $cel
END_CYC
//LOGWRITE($HEX)
END_SUB
SUB(GREYSCALE, $x1, $y1, $x2, $y2)
GETSCREEN($x1, $y1, $x2, $y2)
READMEM($pid, "004E20FC", 4) // читаем адрес начала буфера в указателе
$startbufwr = $_return1 + ($y1*($xmax+1)*4) + ($x1*4) // с этой ячейки начнем
//LOGWRITE($_return1," $startbuf = ", $startbufwr)
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)
//LOGWRITE("$gray_canal = ", $gray_canal, " ", $gray)
toHEX($adrDECwr + $x)
WRITEMEM($pid, $HEX, $gray, 4)
$adrDECwr = $adrDECwr + 3
END_CYC
END_CYC
END_SUB
SUB(SCREENin3, $x1, $y1, $x2, $y2, $x3, $y3)
GETSCREEN($x1, $y1, $x2, $y2)
READMEM($pid, "004E20FC", 4) // читаем адрес начала буфера в указателе
$startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем
//LOGWRITE($_return1," $startbuf = ", $startbufwr)
FOR($y=0, $y < ($y2 - $y1 + 1))
$adrDECwr = $startbufwr + ($y*($xmax+1)*4) //+ ($x*4)
FOR($x=0, $x < ($x2 - $x1 + 1))
$c = PXL($x1+$x, $y1+$y)
$color_new = COLORGEN(COLORB($c), COLORG($c), COLORR($c))
//LOGWRITE("$color_new = ", $color_new)
toHEX($adrDECwr + $x)
WRITEMEM($pid, $HEX, $color_new, 4)
$adrDECwr = $adrDECwr + 3
END_CYC
END_CYC
END_SUB
SUB(SCREENin2, $x1, $y1, $x2, $y2, $x3, $y3)
GETSCREEN($x1, $y1, $x2, $y2)
READMEM($pid, "004E20FC", 4) // читаем адрес начала буфера в указателе
$startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем
//LOGWRITE($_return1," $startbuf = ", $startbufwr)
FOR($y=0, $y < ($y2 - $y1 + 1))
$adrdec = $startbufwr + ($y*($xmax+1)*4) //+ ($x*4)
FOR($x=0, $x < ($x2 - $x1 + 1))
$c = PXL($x1+$x, $y1+$y)
toHEX($adrdec + $x)
WRITEMEM($pid, $HEX, COLORB($c), 1)
toHEX($adrdec + $x + 1)
WRITEMEM($pid, $HEX, COLORG($c), 1)
toHEX($adrdec + $x + 2)
WRITEMEM($pid, $HEX, COLORR($c), 1)
$adrdec = $adrdec + 3
END_CYC
END_CYC
END_SUB
SUB(SCREENin1, $x1, $y1, $x2, $y2, $x3, $y3)
GETSCREEN($x1, $y1, $x2, $y2)
READMEM($pid, "004E20FC", 4) // читаем адрес начала буфера в указателе
$startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем
//LOGWRITE($_return1," $startbuf = ", $startbufwr)
LOGWRITE("Blue")
FOR($y=0, $y < ($y2 - $y1 + 1))
FOR($x=0, $x < ($x2 - $x1 + 1))
$adrdec = $startbufwr + ($y*($xmax+1)*4) + ($x*4)
toHEX($adrdec)
WRITEMEM($pid, $HEX, COLORB(PXL($x1+$x, $y1+$y)), 1)
END_CYC
END_CYC
LOGWRITE("Green")
FOR($y=0, $y < ($y2 - $y1 + 1))
FOR($x=0, $x < ($x2 - $x1 + 1))
$adrdec = $startbufwr + ($y*($xmax+1)*4) + ($x*4) + 1
toHEX($adrdec)
WRITEMEM($pid, $HEX, COLORG(PXL($x1+$x, $y1+$y)), 1)
END_CYC
END_CYC
LOGWRITE("Red")
FOR($y=0, $y < ($y2 - $y1 + 1))
FOR($x=0, $x < ($x2 - $x1 + 1))
$adrdec = $startbufwr + ($y*($xmax+1)*4) + ($x*4) + 2
toHEX($adrdec)
WRITEMEM($pid, $HEX, COLORR(PXL($x1+$x, $y1+$y)), 1)
END_CYC
END_CYC
// в этой ячейке прозрачность, по умолчания записано "255"
//FOR($y=0, $y < ($y2 - $y1 +1))
// FOR($x=0, $x < ($x2 - $x1 +1))
// toHEX($startbufwr + ($y*($_xmax+1)*4) + ($x*4) + 3)
// WRITEMEM($pid, $HEX, 100, 1)
// END_CYC
//END_CYC
END_SUB
SUB(SCREENin4, $x1, $y1, $x2, $y2, $x3, $y3)
GETSCREEN($x1, $y1, $x2, $y2)
READMEM($pid, "004E20FC", 4) // читаем адрес начала буфера в указателе
$startbufwr = $_return1 + ($y3*($xmax+1)*4) + ($x3*4) // с этой ячейки начнем
$startbufrd = $_return1 + ($y1*($xmax+1)*4) + ($x1*4)
//LOGWRITE($_return1," $startbuf = ", $startbufwr)
FOR($y=0, $y < ($y2 - $y1 + 1))
$adrDECrd = $startbufrd + ($y*($xmax+1)*4)
$adrDECwr = $startbufwr + ($y*($xmax+1)*4)
FOR($x=0, $x < ($x2 - $x1 + 1))
toHEX($adrDECrd + $x)
READMEM($pid, $HEX, 4)
$color = $_return1
toHEX($adrDECwr + $x)
WRITEMEM($pid, $HEX, $color, 4)
$adrDECrd = $adrDECrd + 3
$adrDECwr = $adrDECwr + 3
END_CYC
END_CYC
END_SUB
SUB(test1, $x1, $y1, $x2, $y2, $x3, $y3) //=== для тестов ====================
GETSCREEN($x1, $y1, $x2, $y2)
READMEM($pid, "004E20FC", 4) //читаем адрес начала буфера в указателе
$startbufrd = $_return1 + ($y1*($xmax+1)*4) + ($x1*4) // с этой ячейки начнем
toHEX($startbufrd)
LOGWRITE(COLORB(pxl($x1+0, $y1+0)))
READMEM($pid, $HEX, 1)
LOGWRITE($_return1)
$timer1 = $_ms
FOR($nn=0, $nn < 10000)
READMEM($pid, $HEX, 1)
$t = $_return1
END_CYC
print_timeaction("screen_test", $_ms - $timer1)
HALT
END_SUB
SUB(test2, $x1, $y1)
GETSCREEN($x1-1, $y1-1, $x1+1, $y1+1)
//SCREENSHOTEX($x1-1, $y1-1, $x1+1, $y1+1, "Color_", 0)
READMEM($pid, "004E20FC", 4) //читаем адрес начала буфера в указателе
$startbufrd = $_return1 + ($y1*($xmax+1)*4) + ($x1*4)
$adrdec = $startbufrd
toHEX($adrdec)
$c = PXL($x1, $y1)
LOGWRITE($c, " RGB ", COLORR($c), " ", COLORG($c), " ", COLORB($c))
READMEM($pid, $HEX, 4)
$read = $_return1
toHEX($adrdec)
READMEM($pid, $HEX, 1)
$b = $_return1
toHEX($adrdec + 1)
READMEM($pid, $HEX, 1)
$g = $_return1
toHEX($adrdec + 2)
READMEM($pid, $HEX, 1)
$r = $_return1
toHEX($adrdec + 3)
READMEM($pid, $HEX, 1)
$a = $_return1
// 16777215 16711936 2147483648
LOGWRITE($read, " 2RGB ", $r, " ", $g, " ", $b, " ", $a) //
LOGWRITE(" RGB ", COLORR($read), " ", COLORG($read), " ", COLORB($read))
HALT
END_SUB
// =============================================================================
//##############################################################################
WAITMS(300)
LOGCLEAR
log_show()
$xmax = $_xmax
$ymax = $_ymax
//test1(70, 75, 79, 84, 5, 40)
//test2(194, 347)
//test2(222, 552)
GETSCREEN
$timer1 = $_ms
// SCREENin OLD Original
// поканально, старое вычисление HEX = 17.70 ms/pxl
// 30х30 ~16000 мс 17.77 ms/pxl
// 10х10 ~1770 мс 17.70 ms/pxl
// SCREENin1 OLD
// поканально, новое вычисление HEX = 14.70 ms/pxl -17%
// 30х30 ~13500 мс, ~13300 мс 14.77 ms/pxl
//SCREENin1(70, 75, 99, 104, 5, 40)
// 10х10 ~1515 мс, ~1470 мс 14.70 ms/pxl
//SCREENin1(70, 75, 79, 84, 5, 40)
// SCREENin2
// один PXL, часть адреса на строку = 13.70 ms/pxl -6.8%
// 30х30 ~12508 мс, ~12345 мс 13.72 ms/pxl
//SCREENin2(70, 75, 99, 104, 5, 40)
// 10х10 ~1370 мс, ~1354 мс 13.70 ms/pxl
//SCREENin2(70, 75, 79, 84, 5, 40)
// SCREENin3
// попиксельно, Пишем по 4 байта = 5.14 ms/pxl -62.5% !!!
// 30х30 ~4648 мс, ~4620 мс 5.14 ms/pxl
//SCREENin3(70, 75, 99, 104, 5, 40)
// 10х10 ~524 мс, ~518 мс 5.18 ms/pxl
//SCREENin3(70, 75, 79, 84, 5, 40)
// SCREENin4 BAD по 2 расчёта HEX адреса
// прямое копирование по 4 байта = 9.48 ms/pxl +84% :((
// 30х30 ~8535 мс 9.48 ms/pxl
//SCREENin4(70, 75, 99, 104, 5, 40)
// 10х10 ~521 мс, ~506 мс 5.06 ms/pxl
//SCREENin3(70, 75, 79, 84, 5, 40)
// GREYSCALE = 5.25 ms/pxl
// 10х10 ~555 мс, ~552 мс 5.52 ms/pxl
//GREYSCALE(70, 75, 79, 84)
// 20х20 400 pxl ~2167 мс 5.42 ms/pxl
//GREYSCALE(772, 432, 791, 451)
// 100х100 10000 pxl ~53956 мс, 52431 5.25 ms/pxl
//GREYSCALE(750, 426, 849, 525)
// PXLREPLACE 100х100 10000 pxl
// 8100 ms 0.81 ms/pxl
// 100х100 10000 pxl ~1400 мс, 1270 0.127 ms/pxl
// CME_GREYSCALE() AutiIt
print_timeaction("screen_", $_ms - $timer1)
SCREENSHOTEX(0,0, 150,150, "Copy_", 0)
//SCREENSHOTEX(700,400, 900,550, "Gray_", 0)
HALT