MaGetzUb wrote:Tässä aikoinaan kirjoittamani kuvan piirto läpinäkyvyyden ja maskivärin kanssa; [koodia] Saisiko tuota nopeutettua kirjastollasi? Miten?
Kokeilinpa tuon porttaamista cbCalcille, sain pari FPS enemmän. Ilman cbCalcia 10-11 FPS, cbCalcin kanssa 12-13 FPS. Tässä tapauksessa siis huomataan erityisesti että kun piirtämiseen/kuvapikselien hakuun kuluu paljon aikaa niin cbCalcin käyttö ei hyödytä juurikaan.
Code: Select all
Include "cbCalc.CB"
map = LoadImage("Map.BMP")
img = LoadImage("grass.BMP")
cbCalc_InitDLL()
w = ImageWidth(img)
h = ImageHeight(img)
size = w*h*4
count = w*h
source = MakeMEMBlock(size*3)
over = MakeMEMBlock(size*3)
target = MakeMEMBlock(size*3)
Lock Image(img)
For i = 0 To w-1
For j = 0 To h-1
pix = GetPixel2(i,j,Image(img))
pointer = (j*w+i)*4
If pix <> (maskr + (maskg Shl 8) + (maskg Shl 16) + (255 Shl 24)) Then
PokeFloat over,pointer,((pix Shl 8) Shr 24)
PokeFloat over,pointer+size,((pix Shl 16) Shr 24)
PokeFloat over,pointer+size*2,((pix Shl 24) Shr 24)
EndIf
Next j
Next i
Unlock Image(img)
ab = 127.5
Repeat
ab = ab + MouseMoveZ()
x=MouseX()
y=MouseY()
DrawImage map,0,0
If ab>0 Then
Lock SCREEN()
For i = 0 To w-1
For j = 0 To h-1
If (x+i) > 0 And (x+i) < ScreenWidth()-1 And (y+j) > 0 And (y+j) < ScreenHeight()-1 Then
pointer = (j*w+i)*4
scrpix = GetPixel2(x+i,y+j,SCREEN())
PokeFloat source,pointer,((scrpix Shl 8) Shr 24)
PokeFloat source,pointer+size,((scrpix Shl 16) Shr 24)
PokeFloat source,pointer+size*2,((scrpix Shl 24) Shr 24)
EndIf
Next j
Next i
// target = over + (over - source) / 255.0 * ab
//--------------------
// target = over
// target = target - source
// target = target/255.0
// target = target*ab
// target = target + over
// target = over
cbCalc_memadvcpy(over, target, 0, 4, count*3, 4, 0, 4)
// target = target - source
cbCalc_subtraction(source, target, count*3)
// target = target/255.0
cbCalc_div_by(target, 255.0, count*3)
// target = target*ab
cbCalc_mult_by(target, Float(ab), count*3)
// target = target + over
cbCalc_addition(over, target, count*3)
For i = 0 To w-1
For j = 0 To h-1
If (x+i) > 0 And (x+i) < ScreenWidth()-1 And (y+j) > 0 And (y+j) < ScreenHeight()-1 Then
pointer = (j*w+i)*4
tr = PeekFloat(target,pointer)
tg = PeekFloat(target,pointer+size)
tb = PeekFloat(target,pointer+size*2)
PutPixel2 x+i,y+j, tb + (tg Shl 8) + (tr Shl 16) + (255 Shl 24), SCREEN()
EndIf
Next j
Next i
Unlock SCREEN()
EndIf
Text 0,0, FPS()+" "+ab
DrawScreen Not MouseDown(1)
Forever
EDIT: Knoy, en sitten tiedä johtuiko tuo funktiokutsun poistamisesta ja lähdekuvan kuvapikseliden esilaskemisesta. Voi myös olla ettei maskiväri enää toimi kunnolla, vaan enpä jäänyt sitä miettimään.
Pikselinkäsittelyyn olisi kiva jos itse pikseliarvolle voisi tehdä suoraan laskutoimituksia kuin ne olisivat RGB arvoja. Esimerkki:
Code: Select all
img= LoadImage("media/cow.bmp")
w = ImageWidth(img)
h = ImageHeight(img)
mem = MakeMEMBlock(w*h)
Lock Image(img)
For y=0 To h-1
For x=0 To w-1
p = GetPixel2(x,y,Image(Img))
PokeFloat mem, (y*w+x)*4, p
Next x
Next y
Unlock Image(img)
//tällä saataisiin pikselien väriarvo
//puolitettua eli RGB=(255,0,0) -> (128,0,0)
//jolloin saataisiin kuvaa nopeasti tummennettua
//tätä tulisi voida käyttää myös toisen muistipalan
//kanssa jolloin voidaan kuvia sulauttaa toisiinsa.
cbCalc_pixel_mult_by(mem, 0.5, w*h)