ich arbeite gerade mit Images und Texturen und habe eine Routine geschrieben die ich aus Zeitgründen optimieren möchte. Vielleicht hat jemand einen Tipp (speziell Windows)? Die folgende Routine lädt ein Image in den Arbeitsspeicher und die drei Farben und der Alpha Wert werden aktiv verändert. Dazu benötigt mein Rechner allerdings 38,5 Sekunden...
die spezielle zeitkritische Routine
Code: Alles auswählen
;---------------------------------------- Zeitkritische Routine
;CheckVal = Ausnamefarbe die nicht geändert werden darf
max = *Pointer + ImageWidth(Image) * ImageHeight(Image) << 2
*Pointer + color
While *Pointer < max
If PeekB(*Pointer) <> CheckVal
PokeB( *Pointer , ColorVal )
EndIf
*Pointer + 4 ; Vier Sprünge weiter da der RGBA Wert ein .l Wert ist
Wend
;-----------------------------------------
Kompletter Beispielcode
Code: Alles auswählen
ImageW = 375
ImageH = 350
Global *Memory = AllocateMemory(ImageW * ImageH << 2 )
Procedure CopyImageToMemory(ImageNumber, Memory)
Protected TemporaryDC.L, TemporaryBitmap.BITMAP, TemporaryBitmapInfo.BITMAPINFO
TemporaryDC = CreateDC_("DISPLAY", #Null, #Null, #Null)
GetObject_(ImageID(ImageNumber), SizeOf(BITMAP), TemporaryBitmap.BITMAP)
TemporaryBitmapInfo\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
TemporaryBitmapInfo\bmiHeader\biWidth = TemporaryBitmap\bmWidth
TemporaryBitmapInfo\bmiHeader\biHeight = -TemporaryBitmap\bmHeight
TemporaryBitmapInfo\bmiHeader\biPlanes = 1
TemporaryBitmapInfo\bmiHeader\biBitCount = 32
TemporaryBitmapInfo\bmiHeader\biCompression = #BI_RGB
GetDIBits_(TemporaryDC, ImageID(ImageNumber), 0, TemporaryBitmap\bmHeight, Memory, TemporaryBitmapInfo, #DIB_RGB_COLORS)
DeleteDC_(TemporaryDC)
EndProcedure
Procedure CopyMemoryToImage(Memory, ImageNumber)
Protected TemporaryDC.L, TemporaryBitmap.BITMAP, TemporaryBitmapInfo.BITMAPINFO
TemporaryDC = CreateDC_("DISPLAY", #Null, #Null, #Null)
GetObject_(ImageID(ImageNumber), SizeOf(BITMAP), TemporaryBitmap.BITMAP)
TemporaryBitmapInfo\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
TemporaryBitmapInfo\bmiHeader\biWidth = TemporaryBitmap\bmWidth
TemporaryBitmapInfo\bmiHeader\biHeight = -TemporaryBitmap\bmHeight
TemporaryBitmapInfo\bmiHeader\biPlanes = 1
TemporaryBitmapInfo\bmiHeader\biBitCount = 32
TemporaryBitmapInfo\bmiHeader\biCompression = #BI_RGB
SetDIBits_(TemporaryDC, ImageID(ImageNumber), 0, TemporaryBitmap\bmHeight, Memory, TemporaryBitmapInfo, #DIB_RGB_COLORS)
DeleteDC_(TemporaryDC)
EndProcedure
Procedure MP_ImageSetColor (Image, Color, ColorVal, CheckVal) ; Verändert destruktiv eine ARGB Farbe um einen FestenWert, mit Ausnamecheck
*Pointer = *Memory
CopyImageToMemory(Image, *Memory)
;---------------------------------------- Zeitkritische Routine
;CheckVal = Ausnamefarbe die nicht geändert werden darf
max = *Pointer + ImageWidth(Image) * ImageHeight(Image) << 2
*Pointer + color
While *Pointer < max
If PeekB(*Pointer) <> CheckVal
PokeB( *Pointer , ColorVal )
EndIf
*Pointer + 4 ; Vier Sprünge weiter
Wend
;-----------------------------------------
CopyMemoryToImage(*Memory, 0)
EndProcedure
;
; ------------------------------------------------------------
;
; PureBasic - 2D Drawing example file (alpha channel demo)
;
; (c) 2009 - Fantaisie Software
;
; ------------------------------------------------------------
;
If OpenWindow(0, 0, 0, 375, 350, "Alphachannel demo", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreateImage(0, ImageW, ImageH, 32) And StartDrawing(ImageOutput(0))
; Make the whole image transparent
;
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0, 0, 375, 350, $00000000)
; The classic Circle-thing :)
;
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle( 187, 225, 100, RGBA(255, 0, 0, 128))
Circle(250, 125, 100, RGBA( 0, 255, 0, 128))
Circle(125, 125, 100, RGBA( 0, 0, 255, 128))
StopDrawing()
EndIf
If CreateImage(1, ImageW, ImageH, 32)
EndIf
; Hier mein Code zum speichern und neu laden
#box_size = 7
StartTime = ElapsedMilliseconds() ; ermittelt den aktuellen Wert
Repeat
a + 1
If a > 255
a = 1
b+1
EndIf
If b > 3
ElapsedTime = ElapsedMilliseconds()-StartTime
MessageRequester("Zeitmessung", "Dauer = "+Str(ElapsedTime))
StartTime = ElapsedMilliseconds()
b = 0
EndIf
MP_ImageSetColor (0, b, a, 0)
; Mal Image
StartDrawing(ImageOutput(1))
Box(0, 0, 375, 350, $FFFFFF)
For y = 0 To 350 Step #box_size*2
For x = 0 To 375 Step #box_size*2
Box(x, y, #box_size, #box_size, $C0C0C0)
Box(x+#box_size, y+#box_size, #box_size, #box_size, $C0C0C0)
Next x
Next y
DrawAlphaImage(ImageID(0), 0, 0)
StopDrawing()
StartDrawing(WindowOutput(0))
DrawAlphaImage(ImageID(1), 0, 0)
StopDrawing()
Until WindowEvent() = #PB_Event_CloseWindow
EndIf
Gruß Michael
