PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Тоннельчик - порт с FreeBasic


Тоннельчик - порт с FreeBasic

Сообщений 1 страница 4 из 4

1

Подскажите, пожалуйста, можно ли ускорить?

Код:
#SCR_WIDTH = 320  * 1
#SCR_HEIGHT = 240 * 1
#SCR_SIZE = #SCR_WIDTH * #SCR_HEIGHT

#TWID = #SCR_WIDTH
#THEI = #SCR_HEIGHT
#TWIDM1 = #TWID - 1
#THEIM1 = #THEI - 1

#MAXPOINTS = 32

#XMID = #SCR_WIDTH / 2
#YMID = #SCR_HEIGHT / 2

RandomSeed(1234)
Global Dim xcoords.f(#MAXPOINTS)
Global Dim ycoords.f(#MAXPOINTS)
Global Dim Buffer.l(#SCR_SIZE-1 )
Global Dim Tangle.l( #TWID, #THEI)
Global Dim Tdepth.l( #TWID, #THEI)
Global Dim Texture.l( 255, 255)
Global Dim Distbuffer.f( 255, 255)

Procedure.f dist(x.f,y.f)
  mindist.f = 1000000;$1D+$16
                     ;max = UBOUND(xc.f)
  For i = 0 To #MAXPOINTS;max
    a.f = (xcoords(i) - x) * (xcoords(i) - x)
    b.f = (ycoords(i) - y) * (ycoords(i) - y)
    d.f = Sqr(a + b)
    If d < mindist
      mindist = d
    EndIf
  Next i
  ProcedureReturn mindist
EndProcedure

;Procedure PrecalcLUTS(byref Tangle() As integer, byref TDepth() As integer diameter)
Procedure PrecalcLUTS(diameter)
  ;Dim cx, cy, x, y As integer
  ;Dim distance As single
  cx.l = #TWID/2
  cy.l = #THEI/2
  
  For x = 0 To #TWID - 1
    For y = 0 To #THEI  -1
      Tangle(x, y) = Int(ATan2(cy - y, cx - x) * 256 / #PI )
      distance.f = (Sqr((x-cx)*(x-cx) + (y-cy)*(y-cy)))
      Tdepth(x, y) =  256 * diameter / distance
    Next y
    ;    flow = flow + flowadd
  Next x
EndProcedure

Procedure DrawTunnel(addx.l,addy.l)
  For y = 0 To #THEIM1
    For x = 0 To #TWIDM1
      tx.l = (Tangle(x,y) + addx) &255
      ty.l = (Tdepth(x,y) + addy) & 255
      ;buffer( y * #SCR_WIDTH + x) = texture(tx, ty)
      Box(x*2,y*2,2,2,texture(tx, ty))
    Next x
  Next y
EndProcedure

If InitSprite() And OpenWindow(0,0,0,640,480,"freeBASIC v0.01 - Tunnel demo(Relsoft)",#PB_Window_SystemMenu) And OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0) 
  For i = 0 To #MAXPOINTS
    xcoords(i) = Random(#SCR_WIDTH)
    ycoords(i) = Random(#SCR_HEIGHT)
  Next i
  
  mindist.f = 1000000;$1D+$16
  maxdist.f = 0
  
  For y = 0 To 255
    For x = 0 To 255
      tx = Abs(x - 128)
      ty = Abs(y - 128)
      distance.f = dist(tx, ty)
      distbuffer.f(x, y) = distance
      If distance < mindist
        mindist = distance
      EndIf
      If distance > maxdist
        maxdist = distance
      EndIf
    Next x
  Next y
  
  For y = 0 To 255
    For x = 0 To 255
      c.f =(distbuffer(x, y) - mindist) / (maxdist - mindist)
      r = Int(c * 55)
      g = Int(c * 155)
      b = Int(c * 255)
      texture(x, y) = RGB(r,g,b);r shl 16 Or g shl 8 Or b
    Next x
  Next y
  
  PrecalcLUTS(64); Tangle(), TDepth(), 64
  
  t.f=0
  
  Repeat 
    StartDrawing(ScreenOutput()) 
    DrawTunnel( (#TWID>>1)* Sin(t *0.5),(t *0.8)* (#THEI>>1) )

;   For y = 0 To 255
;     For x = 0 To 255
;       Box(x*2,y*2,2,2,texture(x, y))
;     Next x
;   Next y

    t=t+0.2
    StopDrawing() 
    FlipBuffers() 
  Until WindowEvent()=#PB_Event_CloseWindow 
EndIf

https://forumupload.ru/uploads/0009/ae/28/618/t323979.png

0

2

Да вроде нормально по скорости.
Если нужно максимально быстро, следует выключить вертикальную синхронизацию добавив флаг #PB_Screen_NoSynchronization в OpenWindowedScreen().

0

3

Так пошустрее

Код:
#SCR_WIDTH = 320  * 1
#SCR_HEIGHT = 240 * 1
#SCR_SIZE = #SCR_WIDTH * #SCR_HEIGHT

#TWID = #SCR_WIDTH
#THEI = #SCR_HEIGHT
#TWIDM1 = #TWID - 1
#THEIM1 = #THEI - 1

#MAXPOINTS = 32

#XMID = #SCR_WIDTH / 2
#YMID = #SCR_HEIGHT / 2

RandomSeed(1234)
Global Dim xcoords.f(#MAXPOINTS)
Global Dim ycoords.f(#MAXPOINTS)
Global Dim Buffer.l(#SCR_SIZE-1 )
Global Dim Tangle.l( #TWID, #THEI)
Global Dim Tdepth.l( #TWID, #THEI)
Global Dim Texture.l( 255, 255)
Global Dim Distbuffer.f( 255, 255)

Procedure.f dist(x.f,y.f)
  mindist.f = 1000000;$1D+$16
  For i = 0 To #MAXPOINTS
    a.f = (xcoords(i) - x) * (xcoords(i) - x)
    b.f = (ycoords(i) - y) * (ycoords(i) - y)
    d.f = Sqr(a + b)
    If d < mindist
      mindist = d
    EndIf
  Next i
  ProcedureReturn mindist
EndProcedure

Procedure PrecalcLUTS(diameter)
  cx.l = #TWID/2
  cy.l = #THEI/2
  
  For x = 0 To #TWID - 1
    For y = 0 To #THEI  -1
      Tangle(x, y) = Int(ATan2(cy - y, cx - x) * 256 / #PI )
      distance.f = (Sqr((x-cx)*(x-cx) + (y-cy)*(y-cy)))
      Tdepth(x, y) =  256 * diameter / distance
    Next y
    ;    flow = flow + flowadd
  Next x
EndProcedure

Procedure DrawTunnel(addx.l,addy.l)
  For y = 0 To #THEIM1
    For x = 0 To #TWIDM1
      tx.l = (Tangle(x,y) + addx) &255
      ty.l = (Tdepth(x,y) + addy) & 255
      Box(x*2,y*2,2,2,texture(tx, ty))
      ;Box(x,y,1,1,texture(tx, ty))
    Next x
  Next y
EndProcedure

If InitSprite() And OpenWindow(0,0,0,640,480,"freeBASIC v0.01 - Tunnel demo(Relsoft)",#PB_Window_SystemMenu) And OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0,#PB_Screen_NoSynchronization)
  For i = 0 To #MAXPOINTS
    xcoords(i) = Random(#SCR_WIDTH)
    ycoords(i) = Random(#SCR_HEIGHT)
  Next i
  
  SetFrameRate(60)
  
  mindist.f = 1000000;$1D+$16
  maxdist.f = 0
  
  For y = 0 To 255
    For x = 0 To 255
      tx = Abs(x - 128)
      ty = Abs(y - 128)
      distance.f = dist(tx, ty)
      distbuffer.f(x, y) = distance
      If distance < mindist
        mindist = distance
      EndIf
      If distance > maxdist
        maxdist = distance
      EndIf
    Next x
  Next y
  
  For y = 0 To 255
    For x = 0 To 255
      c.f =(distbuffer(x, y) - mindist) / (maxdist - mindist)
      r = Int(c * 55)
      g = Int(c * 155)
      b = Int(c * 255)
      texture(x, y) = RGB(r,g,b)
    Next x
  Next y
  
  PrecalcLUTS(64)
  
  t.f=0
  
  AddWindowTimer(0,1,50)
  CreateImage(0,640,480)
  Repeat
    ev=WindowEvent()
    If GetAsyncKeyState_(#VK_ESCAPE)&32768
      Break
    EndIf
    
    If ev=#PB_Event_Timer
      StartDrawing(ImageOutput(0))
      DrawTunnel( (#TWID>>1)* Sin(t *0.5),(t *0.8)* (#THEI>>1) )
      StopDrawing() 
      StartDrawing(WindowOutput(0)) 
      DrawImage(ImageID(0),0,0)
      StopDrawing() 
      t=t+0.2
    EndIf
  Until ev=#PB_Event_CloseWindow 
EndIf

0

4

не стал разбираться в чем разница, тупо скопипастил оба варианта и первый вариант оказался шустрее
Upd посмотрел мельком код, оказалось во втором примере скорость можно регулировать таймером...

Отредактировано amer (31.01.2025 14:19:02)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Тоннельчик - порт с FreeBasic