|
|
  |
Помогите освоить LUA |
|
|
sutra |
22.12.2018, 13:45
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Цитата Ноль обозначает номер элемента Отлично, именно это и хотел спросить, и именно так и думал. Если есть своя структура, ну например ffi.cdef[[typedef struct{uint8_t red,green,blue;}rgb]] , то мы можем в ридмеме использовать её? И сразу иметь все 3 канала? Грубо говоря в идеале заставить ридмем считывать столько байт, сколько надо. То есть есть структура из 3-х байт. Я объявляю допустим 10 элементов этой структуры и чтобы сразу поиметь 30 байт, которые ровно лягут во все 10 элементов. Я правильно понял что вот эту хрень - s[7]=rmem("unsigned char*",ind+1)[0] я могу заменить на эту - s[7]=rmem("unsigned char*",ind)[1] ?? На последний вопрос ответ получен, можно.
|
|
|
|
sutra |
22.12.2018, 18:48
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Цитата ты не пробовал не переменные использовать в ифах, а напрямую читать память? Не пробовал, но думал, но ведь это всё равно будет делать lua и значит будет приведение типов. У меня тут десятки разных вариантов. Вот тебе чисто для примера, может я чего-то просто не вижу. Код --lua local ffi=require "ffi" -- Использование модуля ffi для использования СИ структур local rmem=ffi.cast -- Использование функции чтения из памяти модуля ffi ffi.cdef[[typedef struct{uint16_t x,y; uint8_t red,green,blue;}xyrgb]] -- Определение структуры массива чтения данных из памяти образа картинки local function FindMemRGBpf(addr,len,scrX1,scrY1,fx1,fy1,fx2,fy2,usl,numf) -- ПОИСК ПИКСЕЛЕЙ ПО ЗНАЧЕНИЯМ RGB В ОБЛАСТИ ПАМЯТИ -- addr,len : адрес в памяти, длина строки в памяти (то, что даёт getimage) -- scrX1,scrY1 : координаты верхнего левого угла образа в памяти, должны быть аналогичны координатам getimage -- fx1,fy1,fx2,fy2 : координаты поиска пикселей, абсолютные относительно рабочего окна. Должны быть внутри диапазона координат образа в памяти. -- usl : ОДНО строковое условие поиска "R(10-255) G(70-100) B(50) R-G[50 200] R-B[-40 -20] G-B[15]". -- numf : максимальное количество искомых пикселей local n=math.min(numf,(fx2-fx1+1)*(fy2-fy1+1)) -- Определение максимальной размерности возвращаемого функцией СИ массива найденных пикселей local arr=ffi.new("xyrgb[?]",n) -- Инициализация СИ массива искомых пикселей (используя ранее описанную структуру) local r1,r2=usl:match("R%((%d+)%-*(%d*)") local g1,g2=usl:match("G%((%d+)%-*(%d*)") local b1,b2=usl:match("B%((%d+)%-*(%d*)") local RG1,RG2=usl:match("R%-G%[(%-*%d+)%s*(%-*%d*)") local RB1,RB2=usl:match("R%-B%[(%-*%d+)%s*(%-*%d*)") local GB1,GB2=usl:match("G%-B%[(%-*%d+)%s*(%-*%d*)") local r,g,b,cr1,cr2,cg1,cg2,cb1,cb2=ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t"), ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t") local cRG1,cRG2,cRB1,cRB2,cGB1,cGB2,k=ffi.new("int16_t"),ffi.new("int16_t"),ffi.new("int16_t"),ffi.new("int16_t"), ffi.new("int16_t"),ffi.new("int16_t"),ffi.new("int16_t") if r1==nil then cr1,cr2=0,255 else cr1=tonumber(r1) if r2=="" then cr2=cr1 else cr2=tonumber(r2) end end if g1==nil then cg1,cg2=0,255 else cg1=tonumber(g1) if g2=="" then cg2=cg1 else cg2=tonumber(g2) end end if b1==nil then cb1,cb2=0,255 else cb1=tonumber(b1) if b2=="" then cb2=cb1 else cb2=tonumber(b2) end end if RG1==nil then cRG1,cRG2=-255,255 else cRG1=tonumber(RG1) if RG2=="" then cRG2=255 else cRG2=tonumber(RG2) end end if RB1==nil then cRB1,cRB2=-255,255 else cRB1=tonumber(RB1) if RB2=="" then cRB2=255 else cRB2=tonumber(RB2) end end if GB1==nil then cGB1,cGB2=-255,255 else cGB1=tonumber(GB1) if GB2=="" then cGB2=255 else cGB2=tonumber(GB2) end end local indY,ind,caddr,clen,cscrX1,cscrY1,cfx1,cfx2,cfy1,cfy2=ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"), ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t") k,caddr,clen,cscrX1,cscrY1,cfx1,cfx2,cfy1,cfy2=-1,addr,len,scrX1,scrY1,fx1,fx2,fy1,fy2 for i=cfy1,cfy2 do indY=caddr+(i-cscrY1)*clen for j=cfx1,cfx2 do ind=indY+(j-cscrX1)*3 b=rmem("unsigned char*",ind)[0] g=rmem("unsigned char*",ind)[1] r=rmem("unsigned char*",ind)[2] if r>=cr1 and r<=cr2 and g>=cg1 and g<=cg2 and b>=cb1 and b<=cb2 and r-g>=cRG1 and r-g<=cRG2 and r-b>=cRB1 and r-b<=cRB2 and g-b>=cGB1 and g-b<=cGB2 then k=k+1 arr[k].x,arr[k].y,arr[k].red,arr[k].green,arr[k].blue=j,i,r,g,b if numf-1==k then return k,arr end end end end return k,arr end---------------------------------------------------------------------------- local function FindMemRGBpw(addr,len,scrX1,scrY1,fx1,fy1,fx2,fy2,usl,numf) -- ПОИСК ПИКСЕЛЕЙ ПО ЗНАЧЕНИЯМ RGB В ОБЛАСТИ ПАМЯТИ -- addr,len : адрес в памяти, длина строки в памяти (то, что даёт getimage) -- scrX1,scrY1 : координаты верхнего левого угла образа в памяти, должны быть аналогичны координатам getimage -- fx1,fy1,fx2,fy2 : координаты поиска пикселей, абсолютные относительно рабочего окна. Должны быть внутри диапазона координат образа в памяти. -- usl : ОДНО строковое условие поиска "R(10-255) G(70-100) B(50) R-G[50 200] R-B[-40 -20] G-B[15]". -- numf : максимальное количество искомых пикселей local n=math.min(numf,(fx2-fx1+1)*(fy2-fy1+1)) -- Определение максимальной размерности возвращаемого функцией СИ массива найденных пикселей local arr=ffi.new("xyrgb[?]",n) -- Инициализация СИ массива искомых пикселей (используя ранее описанную структуру) local r1,r2=usl:match("R%((%d+)%-*(%d*)") local g1,g2=usl:match("G%((%d+)%-*(%d*)") local b1,b2=usl:match("B%((%d+)%-*(%d*)") local RG1,RG2=usl:match("R%-G%[(%-*%d+)%s*(%-*%d*)") local RB1,RB2=usl:match("R%-B%[(%-*%d+)%s*(%-*%d*)") local GB1,GB2=usl:match("G%-B%[(%-*%d+)%s*(%-*%d*)") local r,g,b,cr1,cr2,cg1,cg2,cb1,cb2=ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t"), ffi.new("uint8_t"),ffi.new("uint8_t"),ffi.new("uint8_t") local cRG1,cRG2,cRB1,cRB2,cGB1,cGB2,k=ffi.new("int16_t"),ffi.new("int16_t"),ffi.new("int16_t"),ffi.new("int16_t"), ffi.new("int16_t"),ffi.new("int16_t"),ffi.new("int16_t") if r1==nil then cr1,cr2=0,255 else cr1=tonumber(r1) if r2=="" then cr2=cr1 else cr2=tonumber(r2) end end if g1==nil then cg1,cg2=0,255 else cg1=tonumber(g1) if g2=="" then cg2=cg1 else cg2=tonumber(g2) end end if b1==nil then cb1,cb2=0,255 else cb1=tonumber(b1) if b2=="" then cb2=cb1 else cb2=tonumber(b2) end end if RG1==nil then cRG1,cRG2=-255,255 else cRG1=tonumber(RG1) if RG2=="" then cRG2=255 else cRG2=tonumber(RG2) end end if RB1==nil then cRB1,cRB2=-255,255 else cRB1=tonumber(RB1) if RB2=="" then cRB2=255 else cRB2=tonumber(RB2) end end if GB1==nil then cGB1,cGB2=-255,255 else cGB1=tonumber(GB1) if GB2=="" then cGB2=255 else cGB2=tonumber(GB2) end end local i,j,indY,ind,caddr,clen,cscrX1,cscrY1,cfx1,cfx2,cfy1,cfy2=ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"), ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t"),ffi.new("uint16_t") i,k,caddr,clen,cscrX1,cscrY1,cfx1,cfx2,cfy1,cfy2=fy1,-1,addr,len,scrX1,scrY1,fx1,fx2,fy1,fy2 while i<=cfy2 do indY,j=caddr+(i-cscrY1)*clen,cfx1 while j<=cfx2 do ind=indY+(j-cscrX1)*3 b=rmem("unsigned char*",ind)[0] g=rmem("unsigned char*",ind)[1] r=rmem("unsigned char*",ind)[2] if r>=cr1 and r<=cr2 and g>=cg1 and g<=cg2 and b>=cb1 and b<=cb2 and r-g>=cRG1 and r-g<=cRG2 and r-b>=cRB1 and r-b<=cRB2 and g-b>=cGB1 and g-b<=cGB2 then k=k+1 arr[k].x,arr[k].y,arr[k].red,arr[k].green,arr[k].blue=j,i,r,g,b if numf-1==k then return k,arr end end j=j+1 end i=i+1 end return k,arr end---------------------------------------------------------------------------- log "clear" log "mode compact" -- сделать окно рабочим local p,_,_,l=getimage(0,0,999,999,ok[1][1])
tmc=os.clock() for jj=1,1000 do k,arr=FindMemRGBpf(p,l,0,0, 0,0,999,999,"R(251)G(112)",2) end log(os.clock()-tmc)
tmc=os.clock() for jj=1,1000 do k,arr=FindMemRGBpw(p,l,0,0, 0,0,999,999,"R(251)G(112)",2) end log(os.clock()-tmc) tmc=os.clock() for jj=1,500 do k,arr=FindMemRGBpf(p,l,0,0, 0,0,999,999,"R-G[139 139]R-B[249 249]",2) end log(os.clock()-tmc)
tmc=os.clock() for jj=1,500 do k,arr=FindMemRGBpw(p,l,0,0, 0,0,999,999,"R-G[139 139]R-B[249 249]",2) end log(os.clock()-tmc)
deleteimage(p) log(k) if k~=-1 then log(arr[k].x,arr[k].y,arr[k].red,arr[k].green,arr[k].blue) end stop_script()
Дарк, подправь, что бы плюсиком код разворачивался. А то страничку испоганило. Для смеха осталось попробовать сделать всё то же самое, прямо в основном теле скрипта. Тут конечно черновые варианты, потом я оптимизирую, но для начала хочу понять где тут костыли. Кстати, когда иф доходит до второй группы сравнения - наступают жесточайшие тормоза (относительные конечно). Естественно я не буду искать при таких дебильных условиях - это чисто для отладки экспериментирую. Сообщение отредактировал DarkMaster - 22.12.2018, 19:51
|
|
|
|
sutra |
22.12.2018, 19:26
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Код --tmc=os.clock() --for jj=1,1000 do -- k,arr=FindMemRGBpf(p,l,0,0, 0,0,999,999,"R(251)G(112)",2) --end --log(os.clock()-tmc)
--tmc=os.clock() --for jj=1,1000 do -- k,arr=FindMemRGBpw(p,l,0,0, 0,0,999,999,"R(251)G(112)",2) --end --log(os.clock()-tmc) tmc=os.clock() for jj=1,500 do k,arr=FindMemRGBpf(p,l,0,0, 0,0,999,999,"R-G[139 139]R-B[249 249]",2) end log(os.clock()-tmc)
tmc=os.clock() for jj=1,500 do k,arr=FindMemRGBpw(p,l,0,0, 0,0,999,999,"R-G[139 139]R-B[249 249]",2) log(os.clock()-tmc) end Попробуйте с заремаренной и разремаренной первой частью. Это у всех такая разница или только у меня. Цитата Когда было такое, исправлялось. Видимо, ещё где-то что-то осталось. У меня причина в первой части скрипта, при заремаренной быстрее почти в 2 раза. Что-то тут нечисто. Или косяк в функции, ну или я не знаю... Наверно потому что объявил их от лени тупо некорректно..
|
|
|
|
|
  |
8 чел. читают эту тему (гостей: 8, скрытых пользователей: 0)
Пользователей: 0
|
|