Fragen zu WritePixelFast

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Nicdel

Betreff: Fragen zu WritePixelFast

BeitragMo, März 23, 2009 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich hab zwei Fragen zu WritePixelFast:

1. Ist der Zugriff auf einen ImageBuffer schneller als der Zugriff auf den BackBuffer?

2. Gibt es noch über DLLs oder Windows API einen schneller Befehl als WritePixelFast?

Mfg Nicdel
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, März 23, 2009 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu 1) kannst du ja mal selbst testen.

Zu 2) Wenn dir WritePixelFast nicht schnell genug ist, dann liegt es sicherlich an der falschen Anwendung.

Code: [AUSKLAPPEN]
Graphics 800,600,0,1
SetBuffer BackBuffer()

Local B=BackBuffer()
Local X,Y,F


While Not KeyHit(1)
   
   If F=0 Then F=-1 Else F=0
   
   LockBuffer B
   
   For Y=0 To 599
      For X=0 To 799
         WritePixelFast X,Y,F,B
      Next
   Next
   
   UnlockBuffer B
   
   Text 20,20,fps:msc=MilliSecs()
   If msc>mts Then mts=msc+1001:fps=frm:frm=0 Else frm=frm+1
   
   Flip 0
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Nicdel

BeitragMo, März 23, 2009 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
WritePixelFast ist schon schnell genug. War nur mal interessehalber.

EDIT: Für die, die's interessiert: Über ImageBuffer ist bei ca. 34500 Pixel um 10 FPS schneller...

EDIT2: Bei 70000 Pixel ist gleich
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
  • Zuletzt bearbeitet von Nicdel am Mo, März 23, 2009 18:03, insgesamt 2-mal bearbeitet

Xaymar

ehemals "Cgamer"

BeitragMo, März 23, 2009 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Nein, er ist gleichschnell. Kannst ja aber ausprobieren
2. Bin ich mir nicht sicher

Du kannst natürlich das Rendern in einen buffern stark beschleunigen indem du dir eine Bank erstellst mit der Größe des Buffers, da alle anderen Images(Als banks) rein"renderst" und dann mit dieser lib in den buffer schiebst.

DECLS:
Code: [AUSKLAPPEN]
.lib "kernel32.dll"
apiRtlMoveMemory(Destination*,Source,Length):"RtlMoveMemory"
apiRtlMoveMemory2(Destination,Source*,Length):"RtlMoveMemory"

Beispiel+Funcs:
Code: [AUSKLAPPEN]
;TEST
Graphics 1024, 768,32,2
SetBuffer BackBuffer()

Gbank = CreateBank(800*600*LockedFormat())
While Not KeyHit(1)
   Cls
   
   msec = MilliSecs()
   LockBuffer
      msec1 = MilliSecs()
      CopyBufferToBank(GBank)
      msec1 = MilliSecs()-msec1
      SX = SX + 5
      If SX >= 512
         SY = SY + 5
         SX = 0
      EndIf
      If SY >= 512
         SY = 0
      EndIf
      For Y = 0 To 128
         For X = 0 To 128
            Pos = (SY * 1024*4) + (Y * 1024*4) + (SX * 4) + (X * 4)
            PokeByte GBank, Pos, X * Y
            PokeByte GBank, Pos+1, SX * X * Y
            PokeByte GBank, Pos+2, SY * X * Y
            PokeByte GBank, Pos+3, SX * SY + X * Y
         Next
      Next
      msec2 = MilliSecs()
      CopyBankToBuffer(GBank)
      msec2 = MilliSecs()-msec2
   UnlockBuffer
   msec = MilliSecs()-msec
   
   CopyRectToBank(20, 20, 100, 100, GBank, BackBuffer())
   
   Text 0,0, msec
   Text 0,15, msec1
   Text 0,30, msec2
   Text 0,45, SX
   Text 0,30, SY
   Flip
Wend
End

;ENDTEST
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

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

Function CopyRectToBank(X, Y, W, H, bank, buffer = 0)
   Local bnkInfo, size
   
   If buffer=0 Then buffer = GraphicsBuffer()
   bnkInfo = CreateBank(32)
   apiRtlMoveMemory bnkInfo, buffer+72, 32
   size = W*H*PeekInt(bnkInfo, 28)/8
   
End Function

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
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group