Max FPS when writing to a Texture?

Blitz3D Forums/Blitz3D Programming/Max FPS when writing to a Texture?

Slider(Posted 2003) [#1]
Has anyone written anything that does some serious dynamic texture updates on the fly? I've seen the code examples that write to an image buffer and then copy the buffer to the texture, but the FPS is terrible.

Is it feasable to write a game in Blitz that would write say 100 pixels per frame to a texture? The key point is that the textures are originally loaded in, but then modified on the fly - not animated.

Just as a test this code draws a line across a texture, but takes 4 seconds on my PC:
  Graphics3D 800, 600
  SetBuffer BackBuffer()

  Global texture = CreateTexture(256,256,4+256)
  Global xPos = 0

  ; Setup the camera, light and create a cube
  camera = CreateCamera()
  light = CreateLight()  
  cube = CreateCube()

  ; Position the camera and cube. Point the camera at the cube
  PositionEntity(camera, 10, 10, 5)
  PositionEntity(cube, 10, 10, 10)
  PointEntity(camera, cube)

  ; Texture the cube
  EntityTexture(cube, texture)

  While Not KeyDown( 1 )
    If xPos < 255 Then xPos = xPos + 1

    ; Green with alpha
    rgb = $FF0000FF 

    ; Draw a pixel on the texture
    WritePixel(xPos, 40, rgb, TextureBuffer(texture))
    
    RenderWorld    
    Flip    
  Wend



Slider(Posted 2003) [#2]
Obviously it's quicker with "Flip False", but it's still takes a second or two. Is this just a no go area in Blitz?


fredborg(Posted 2003) [#3]
Try using LockBuffer, WritePixelFast, UnlockBuffer


semar(Posted 2003) [#4]
In your example, if the main while..wend is executed 50 times each second (by the way, you should use a timer to make it running at your choosen fps), it means that each second, 50 pixels are drawn.

So, to draw a line of 255 pixels, it will take about 5 seconds. (5secs * 50pixels per frame = 250 pixels in 5 secs)

I think, it is completely normal. If you want more speed, then you have different alternatives, for example:
- use a timer with more than 50 frames per seconds, OR:
- plot more pixels at each frame !

What are you trying to do here ? If you want 'super fast pixel drawing' on a texture, then you should draw all the pixels you need to be drawn in just one frame, instead of draw one pixel per frame.

If you plot one pixel at each frame, you will end with a 'super slow pixel drawing' for sure, LOL !!! (no offence !)

Also, the line:
If xPos < 255 Then xPos = xPos + 1

does not take into account, when xPos reaches (and override) 255.. it should be reset or, at least, the y coordinate (fixed to 40 in your example) should change. Or am I missing something ?

Sergio.


GfK(Posted 2003) [#5]
Erm...

You don't need to RenderWorld/Flip every time a pixel is plotted, do you? That's really what's slowing it down, not the texture-drawing itself.

The process itself is actually pretty fast:
Graphics3D 800, 600
  start = MilliSecs()
  SetBuffer BackBuffer()

  Global texture = CreateTexture(256,256,4+256)
  Global xPos = 0

  ; Setup the camera, light and create a cube
  camera = CreateCamera()
  light = CreateLight()  
  cube = CreateCube()

  ; Position the camera and cube. Point the camera at the cube
  PositionEntity(camera, 10, 10, 5)
  PositionEntity(cube, 10, 10, 10)
  PointEntity(camera, cube)

  ; Texture the cube
  EntityTexture(cube, texture)

  While cycles < 500
    
	cycles = cycles + 1
	DrawLine(Rnd(0,255))
    RenderWorld    
    Flip False
  Wend

	Text 0,0,"128,000 pixels written in: " + (MilliSecs()-Start) + "ms"
	Flip
	WaitKey
	End


Function DrawLine(y)
	xpos = 0
	While xpos < 255
    xPos = xPos + 1
	; Green with alpha
    rgb = $FF0FF000
    ; Draw a pixel on the texture
	LockBuffer TextureBuffer(texture)
	WritePixelFast(xPos, y, rgb, TextureBuffer(texture))
	UnlockBuffer TextureBuffer(texture)
	Wend
End Function



semar(Posted 2003) [#6]
Precisely.

And could be even faster by changing this:

Function DrawLine(y)
	xpos = 0
	While xpos < 255
    xPos = xPos + 1
	; Green with alpha
    rgb = $FF0FF000
    ; Draw a pixel on the texture
	LockBuffer TextureBuffer(texture)
	WritePixelFast(xPos, y, rgb, TextureBuffer(texture))
	UnlockBuffer TextureBuffer(texture)
	Wend
End Function


Into this:
Function DrawLine(y)

LockBuffer TextureBuffer(texture)

xpos = 0

; Green with alpha
rgb = $FF0FF000

While xpos < 255
    xPos = xPos + 1
    ; Draw a pixel on the texture
      WritePixelFast(xPos, y, rgb, TextureBuffer(texture))
Wend

UnlockBuffer TextureBuffer(texture)

End Function


And, guess what ? Even super-faster using a timer...

Sergio.


Slider(Posted 2003) [#7]
I see your point(s). I guess I just expected 255 pixels to be drawn in less than a second with "flip false".

Anyway thanks guys