Schnellerer Pixel Zugriff

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Vertex

Betreff: Schnellerer Pixel Zugriff

BeitragMi, Jul 07, 2004 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Ich arbeite gerade daran den Geschwindigkeitsvorteil von BlitzPlus in Sachen Peek/Poke von Pixeln weg zu bekommen, und bilde dafür die Funktionen nach.
BlitzBasic:
Function LockedFormat(buffer = 0)
Local bnkFormat, format

If buffer = 0 Then buffer = GraphicsBuffer()
bnkFormat = CreateBank(4)
apiRtlMoveMemory bnkFormat, buffer+104, 4
format = PeekInt(bnkFormat, 0)
FreeBank bnkFormat

Return format
End Function

Function LockedPitch(buffer = 0)
Local bnkPitch, pitch

If buffer=0 Then buffer = GraphicsBuffer()
bnkPitch = CreateBank(12)
apiRtlMoveMemory bnkPitch, buffer+92, 12
pitch = PeekInt(bnkPitch, 0)*PeekInt(bnkPitch, 8)/8
FreeBank bnkPitch

Return pitch
End Function


Zitat:
.lib "kernel32.dll"
apiRtlMoveMemory(Destination*,Source,Length):"RtlMoveMemory"
apiRtlMoveMemory2(Destination,Source*,Length):"RtlMoveMemory"

LockedPixel werde ich nicht realisieren können, da Blitz3D nicht standartmäßig mit einer Bank im Videospeicher arbeitet, es würde zwar gehen, die Speicheradresse der Bank abzuändern, hätte aber den Nachteil, dass dadurch viel Speicher verschwendet werden würde. Deswegen wird es dann nur die Befehle CopyBufferToBank und CopyBankToBuffer geben. Aber alles erst morgen, habe nämlich gleich Abschlussfeier.
mfg olli

edit: Da es kein BufferWidth / BufferHeight Befehl gibt, habe ich hier noch die Funktionen dafür geschrieben:
BlitzBasic:
Function BufferWidth(buffer = 0)
Local bnkWidth, width

If buffer = 0 Then Return GraphicsWidth()
bnkWidth = CreateBank(4)
apiRtlMoveMemory bnkWidth, buffer+92, 4
width = PeekInt(bnkWidth, 0)
FreeBank bnkWidth

Return width
End Function

Function BufferHeight(buffer = 0)
Local bnkHeight, height

If buffer = 0 Then Return GraphicsHeight()
bnkHeight = CreateBank(4)
apiRtlMoveMemory bnkHeight, buffer+96, 4
height = PeekInt(bnkHeight, 0)
FreeBank bnkHeight

Return height
End Function
  • Zuletzt bearbeitet von Vertex am Do, Jul 08, 2004 13:38, insgesamt einmal bearbeitet

Vertex

BeitragDo, Jul 08, 2004 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich bins nochmal...
BlitzBasic:
Function CopyBufferToBank(bank, buffer = 0)
Local bnkInfo, size

If buffer=0 Then buffer = GraphicsBuffer()
bnkInfo = CreateBank(32)
apiRtlMoveMemory bnkInfo, buffer+72, 32
size = PeekInt(bnkInfo, 20)*PeekInt(bnkInfo, 24)*PeekInt(bnkInfo, 28)/8

If BankSize(bank)<size Or PeekInt(bnkInfo, 0)=0 Then
FreeBank bnkInfo
Return False
Else
apiRtlMoveMemory bank, PeekInt(bnkInfo, 0), size
FreeBank bnkInfo
Return True
EndIf
End Function

Function CopyBankToBuffer(bank, buffer = 0)
Local bnkInfo, size

If buffer=0 Then buffer = GraphicsBuffer()
bnkInfo = CreateBank(32)
apiRtlMoveMemory bnkInfo, buffer+72, 32
size = PeekInt(bnkInfo, 20)*PeekInt(bnkInfo, 24)*PeekInt(bnkInfo, 28)/8

If BankSize(bank)<size Or PeekInt(bnkInfo, 0)=0 Then
FreeBank bnkInfo
Return False
Else
apiRtlMoveMemory2 PeekInt(bnkInfo, 0), bank, size
FreeBank bnkInfo
Return True
EndIf
End Function


CopyBufferToBank ist 14,5 mal schneller als ReadPixelFast, und CopyBankToBuffer ist 3,3 mal schneller als WritePixelFast. Für Blitz2D könnte ich noch eine WrapperDLL schreiben, womit man auch mit CallDLL arbeiten kann. Müsste mich da aber mal mit einem zusammensetzen, der Blitz2D hat um zu wissen, ob die Offsets auch unter Blitz2D gülitgkeit haben.
mfg olli

Edit: Bevor ich es vergesse, der Buffer muss vorher wie bei Write/ReadPixelFats durch LockBuffer gesperrt werden. Die Bank muss größer oder gleich so groß sein wie das Bild. Das bedeutet bei einem Bild mit 100 * 200 Pixel größe und bei
- LockedFormat = 1 eine Größe von 100 * 200 * 2 = 40000 Byte
- LockedFormat = 2 eine Größe von 100 * 200 * 2 = 40000 Byte
- LockedFormat = 3 eine Größe von 100 * 200 * 3 = 60000 Byte
- LockedFormat = 4 eine Größe von 100 * 200 * 4 = 80000 Byte
Die Offsets werden bei LockedFormat = 4 so berechnet:
Offset = (Y*100+X)*4

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group