Author Topic: Bitmap Sinusscroller with low FPS :( Please help ..  (Read 19767 times)

0 Members and 1 Guest are viewing this topic.

Offline DeXtr0

  • C= 64
  • **
  • Posts: 79
  • Karma: 4
  • Proud member of dAWN
    • View Profile
    • dAWN Creations
Hey PureBasic guys,

I hope somebody can help me here.
I'm writing my own intro-fx library in PureBasic and I just finished the sinusscroller fully usable with an own sinustable ;).

Hereby a part of the code which works 100% but it's soo slow ??? , only 175FPS on my Intel Dual Core 3.5 with GForce4 8900GTS?

Code: [Select]
;----------------------------------------------------------
; BITMAP SINUSSCROLL BY DEXTR0/DAWN - 2007
;----------------------------------------------------------

InitSprite()
InitSprite3D()
UsePNGImageDecoder()
InitKeyboard()

;----------------------------------------------------------
; VARIABLES SECTION
;----------------------------------------------------------
ScreenWidth = 800
ScreenHeight = 600

Enumeration
#buffer27 = 98200     ; Used for HScroller Temporary Bitmaptext
#buffer23 = 98220     ; Used for HSrcoller Temporary Screen
#buffer24 = 98240     ; Used for HScroller Final Screen
#buffer25 = 98260     ; Used for HScroller 3D Sprite
#buffer26 = 98300     ; Used for Reserve
#buffer28 = 98340     ; Used fro Mirror Font
#Screenbuffer = -1    ; Screenbuffer
EndEnumeration

Structure HScroll
  id.l
  FontID.l
  MirrorFont.l
  XPos.l
  YPos.l
  yPosMin.l
  yPosMax.l
  YSpeed.l
  YEffectNr.l
  YSpeedAngle.f
  YDirection.l
  NrCharsLine.l
  charwidth.l
  charheight.l
  Speed.l
  SpeedCounter.l
  actNrLines.l
  act_CharNr.l
  ScreenHeight.l
  ScreenWidth.l
  Text.s
  CharXPos.l
  CharYPos.l
  Effekt3D.l
  Rotate_Angle3D.l
  Rotate_Mode3D.l
  ZoomWidth3D.l
  ZoomHeight3D.l
  SinusBuffer.l [1024]
  SinusAngle.f
  SinusRadius.l
  SinusCounter.l
  SinusMaxCount.l
  EndStructure
 
Global Dim DX_HScroller.HScroll(10)

Structure Timer
  id.l
  started.b
  StartTime.l
  StopTime.l
  postiveFlank.b
EndStructure
 
Global Dim DX_Timer.Timer(100)   

;----------------------------------------------------------
; PROCEDURES SECTION
;----------------------------------------------------------
Procedure.f DXP_Sinus(Angle.f)                       
  ProcedureReturn Sin(Angle*(2*3.14159265/360))
EndProcedure   

Procedure DX_DrawText(x, y, Text.s, FrontColor.l = $FFFFFF, BackColor.l = $000000, FontID.l=0)
; -----------------------------------------------------------------------------         
; Name:         DX_DrawText
; Description   Will draw simple text on the screen
;               In black background color & white text color
; Arguments:    X                    X Position of the text
;               Y                    Y Position of the text
;               Text.s               The text that needs to be displayed
;               FrontColor.l         The frontcolor, default WHITE
;               BackColor.l          The Backcolor, default BLACK
;               FontID               Which font to use
; ----------------------------------------------------------------------------- 
  StartDrawing(ScreenOutput())
 
    FrontColor(FrontColor)
    BackColor(BackColor)
   
    If FontID<>0: DrawingFont(FontID) : EndIf
   
    DrawText(x, y, Text.s)
   
  StopDrawing()
   
EndProcedure

Procedure DX_Time(id.l,time.l)
  DX_Timer(id)\postiveFlank=#False
  If  DX_Timer(id)\started=#False
    DX_Timer(id)\started=#True
    DX_Timer(id)\StartTime=ElapsedMilliseconds()
    DX_Timer(id)\StopTime=DX_Timer(id)\StartTime+time
  EndIf
  If ElapsedMilliseconds() >= DX_Timer(id)\StopTime:DX_Timer(id)\postiveFlank=#True:DX_Timer(id)\started=#False:EndIf
EndProcedure

Procedure DX_GetFPS(xpos.l=10,ypos.l=10)
  Global DX_FPSStart.l
  Global DX_FPSCounter.l
  Global DX_FPSOutput.l
  DX_FPSCounter+1
  If GetTickCount_()-DX_FPSStart>1000:DX_FPSStart=GetTickCount_():DX_FPSOutput=DX_FPSCounter:DX_FPSCounter=0:EndIf
  DX_DrawText(xpos,ypos,"FPS: "+Str(DX_FPSOutput))
EndProcedure

Procedure DX_InitHScroll (id.l,FontID.l,charwidth,charheight,XPos.l,YPos.l,NrCharsLine.l,Speed.l,Text.s,Effekt3D.l=0,MirrorFont.l=0)
  ; -----------------------------------------------------------------------------         
  ; Name:         DX_InitHScroll
  ; Description   Init of HScroller
  ; Arguments:    id                  id for HScroll
  ;               FontID              id for used Bitmapfont
  ;               CharWidth           CharWidth of Bitmapfont
  ;               XPos                XPos of HScroll
  ;               YPos                YPos of HScroll
  ;               Speed               Speed of HScroll         -> 0=fastest 1-x=Slower
  ;               ScrollTextPointer   Pointer to the Scrolltext -> for example: @Scrolltext()  if: DIM Scrolltext.s (100)
  ;                                   The Last String in Last array-Element MUST be a "@" - That means new Start of Scrolltext!
  ;               Effekt3D            Choose 3D Function (0-3)  -> 0=no 3D , 1=Zoom , 2 = Rotate , 3= Zoom AND Rotate  (Default=0 (no 3D))       
  ; -----------------------------------------------------------------------------
 
  DX_HScroller(id)\id=id
  DX_HScroller(id)\FontID=FontID
  DX_HScroller(id)\MirrorFont=MirrorFont
  DX_HScroller(id)\charwidth=charwidth
  DX_HScroller(id)\charheight=charheight
  DX_HScroller(id)\XPos=XPos
  DX_HScroller(id)\YPos=YPos
  DX_HScroller(id)\yPosMin=YPos
  DX_HScroller(id)\yPosMax.l=YPos
  DX_HScroller(id)\YSpeed.l=0
  DX_HScroller(id)\YEffectNr.l=0
  DX_HScroller(id)\YSpeedAngle.f=0
  DX_HScroller(id)\YDirection.l=0
  DX_HScroller(id)\NrCharsLine=NrCharsLine
  DX_HScroller(id)\Speed=Speed
  DX_HScroller(id)\SpeedCounter=10
  DX_HScroller(id)\actNrLines=0
  DX_HScroller(id)\act_CharNr=1
  DX_HScroller(id)\ScreenHeight=DX_HScroller(id)\charheight
  DX_HScroller(id)\ScreenWidth=(DX_HScroller(id)\charwidth*DX_HScroller(id)\NrCharsLine)
  DX_HScroller(id)\Text=Text.s
  DX_HScroller(id)\CharXPos=0
  DX_HScroller(id)\CharYPos=0
  DX_HScroller(id)\Effekt3D.l=Effekt3D
  DX_HScroller(id)\Rotate_Angle3D.l=0
  DX_HScroller(id)\Rotate_Mode3D.l=1
  DX_HScroller(id)\ZoomWidth3D.l=0
  DX_HScroller(id)\ZoomHeight3D.l=0
  DX_HScroller(id)\SinusAngle=0.0
  DX_HScroller(id)\SinusRadius=0
  For i.l=0 To 1023
    DX_HScroller(id)\SinusBuffer[i]=0
  Next
  DX_HScroller(id)\SinusCounter=0
  DX_HScroller(id)\SinusMaxCount=360
 
 
  ;Catch Font to Buffer
  CatchSprite(DX_HScroller(id)\id+#buffer25,FontID)
   ;Create Sprite for Temporary Bitmaptext
  CreateSprite(DX_HScroller(id)\id+#buffer27,DX_HScroller(id)\ScreenWidth,DX_HScroller(id)\ScreenHeight)
  ;Create Sprite for Temporary Screen
  CreateSprite(DX_HScroller(id)\id+#buffer23,DX_HScroller(id)\ScreenWidth,DX_HScroller(id)\ScreenHeight)
   Sprite3DQuality(1)
  ;Create Sprite for Final Screen
  CreateSprite(DX_HScroller(id)\id+#buffer24,DX_HScroller(id)\ScreenWidth,DX_HScroller(id)\ScreenHeight,#PB_Sprite_Texture)
 
EndProcedure

Procedure DX_HScrollerRestoreSinusTable(id.l,SinusTable.l,MaxIndex.l)
  Restore SinusTable
  For i.l=0 To MaxIndex-1
    Read DX_HScroller(id)\SinusBuffer[i]
  Next
EndProcedure

Procedure DX_HScrollerSetSinusMaxCount(id.l,SinusMaxCount.l)
  DX_HScroller(id)\SinusMaxCount=SinusMaxCount-1
EndProcedure

Procedure.s DXP_GetHScrollerBitmapTextChar(id.l,act_CharNr.l)
  ; -----------------------------------------------------------------------------         
  ; Name:         DXP_GetHScrollerBitmapTextChar
  ; Description   Returns the actual Char out of a String
  ; Arguments:    id                  id for HScroll
  ;               act_CharNr          Charnumber from the Char which shall be extracted out of a String               
  ; -----------------------------------------------------------------------------
  ProcedureReturn Mid(DX_HScroller(id)\Text,act_CharNr,1)
EndProcedure

Procedure DXP_CalcHScrollerBitmapTextCharPosXY(id,Char.s)
  ; -----------------------------------------------------------------------------         
  ; Name:         DXP_CalcHScrollerBitmapTextCharPosXY
  ; Description   Calculation of the Char in a Bitmapfont
  ; Arguments:    id                  id for HScroll
  ;               Char                Char who shall be calculated               
  ; -----------------------------------------------------------------------------
  a.l=Asc(Char)-32
  If a/19 < 0
    DX_HScroller(id)\CharYPos=0
    DX_HScroller(id)\CharXPos=a%19
  Else
    DX_HScroller(id)\CharYPos=a/19
    DX_HScroller(id)\CharXPos=a%19
  EndIf
EndProcedure

Procedure DXP_HScrollerGetBitmaptext(id)
  ; -----------------------------------------------------------------------------         
  ; Name:         DXP_HScrollerGetBitmaptext
  ; Description   makes a Bitmaptext out of a String
  ; Arguments:    id                  id for HScroll
  ; -----------------------------------------------------------------------------
  UseBuffer(DX_HScroller(id)\id+#buffer27)
   DXP_CalcHScrollerBitmapTextCharPosXY(id,DXP_GetHScrollerBitmapTextChar(DX_HScroller(id)\id,DX_HScroller(id)\act_CharNr))
    ClipSprite(DX_HScroller(id)\id+#buffer25,DX_HScroller(id)\CharXPos*DX_HScroller(id)\charwidth,DX_HScroller(id)\CharYPos*DX_HScroller(id)\charheight,DX_HScroller(id)\charwidth,DX_HScroller(id)\charheight)
    DisplaySprite(DX_HScroller(id)\id+#buffer25,0,0)
  UseBuffer(#Screenbuffer)
EndProcedure

Procedure DX_HScrollerRotateSinustable(id.l)
  If DXP_GetHScrollerBitmapTextChar(DX_HScroller(id)\id,DX_HScroller(id)\act_CharNr)="a"
    c.l=DX_HScroller(id)\SinusBuffer[0]
    For i.l=0 To DX_HScroller(id)\SinusMaxCount
      DX_HScroller(id)\SinusBuffer[i]=DX_HScroller(id)\SinusBuffer[i+1]
    Next
    DX_HScroller(id)\SinusBuffer[DX_HScroller(id)\SinusMaxCount]=c
  EndIf
EndProcedure

Procedure DX_DrawHScroller(id.l)
  ; -----------------------------------------------------------------------------         
  ; Name:         DX_DrawHScroller
  ; Description   Draws the HScroll to Screen
  ; Arguments:    id                  id for HScroll
  ; -----------------------------------------------------------------------------
  If DX_HScroller(id)\Speed < DX_HScroller(id)\SpeedCounter
    DX_HScroller(id)\SpeedCounter=DX_HScroller(id)\SpeedCounter-1
  Else
    DX_HScroller(id)\SpeedCounter=10
    UseBuffer(DX_HScroller(id)\id+#buffer23)
    ClipSprite(DX_HScroller(id)\id+#buffer23,1,0,DX_HScroller(id)\ScreenWidth-1,DX_HScroller(id)\ScreenHeight)
    DisplaySprite(DX_HScroller(id)\id+#buffer23,0,0)
    ClipSprite(DX_HScroller(id)\id+#buffer27,DX_HScroller(id)\actNrLines,0,1,DX_HScroller(id)\charheight)
    DisplaySprite(DX_HScroller(id)\id+#buffer27,DX_HScroller(id)\ScreenWidth-1,0)
    DX_HScroller(id)\actNrLines=DX_HScroller(id)\actNrLines+1
    If DX_HScroller(id)\actNrLines > DX_HScroller(id)\charwidth
      If Not DXP_GetHScrollerBitmapTextChar(DX_HScroller(id)\id,DX_HScroller(id)\act_CharNr)="@" 
        DXP_HScrollerGetBitmaptext(id)
        DX_HScroller(id)\act_CharNr+1
      Else
        DX_HScroller(id)\act_CharNr=1
        DXP_HScrollerGetBitmaptext(id)
        DX_HScroller(id)\act_CharNr+1
      EndIf
      DX_HScroller(id)\actNrLines=0
    EndIf
  EndIf
 
  ;SPEED
  Select DXP_GetHScrollerBitmapTextChar(DX_HScroller(id)\id,DX_HScroller(id)\act_CharNr)
    Case "a":
      DX_HScroller(id)\SpeedCounter=10000
      DX_Time(DX_HScroller(id)\id+90,1000*(Asc(DXP_GetHScrollerBitmapTextChar(DX_HScroller(id)\id,DX_HScroller(id)\act_CharNr+1))-$30))
      If DX_Timer(DX_HScroller(id)\id+90)\postiveFlank:DX_HScroller(id)\SpeedCounter=10:DX_HScroller(id)\act_CharNr+2:EndIf
    Case "b":
      DX_HScroller(id)\Speed=1
    Case "c":
      DX_HScroller(id)\Speed=2
    Case "d":
      DX_HScroller(id)\Speed=3
    Case "e":
      DX_HScroller(id)\Speed=4
    Case "f":
      DX_HScroller(id)\Speed=5
    Case "g":
      DX_HScroller(id)\Speed=6
    Case "h":
      DX_HScroller(id)\Speed=7
    Case "i":
      DX_HScroller(id)\Speed=8
    Case "j":
      DX_HScroller(id)\Speed=9
    Case "k":
      DX_HScroller(id)\Speed=10
    Default:
          ;DX_HScroller(id)\Speed=3
  EndSelect
   
  UseBuffer(DX_HScroller(id)\id+#buffer24)
  ClipSprite(DX_HScroller(id)\id+#buffer23,0,0,DX_HScroller(id)\ScreenWidth,DX_HScroller(id)\ScreenHeight)
  DisplaySprite(DX_HScroller(id)\id+#buffer23,0,0)
   
  UseBuffer(#Screenbuffer)
  ClipSprite(DX_HScroller(id)\id+#buffer24,0,0,DX_HScroller(id)\ScreenWidth,DX_HScroller(id)\ScreenHeight)
 
  Select DX_HScroller(id)\Effekt3D
    Case 5 
      DX_HScrollerRotateSinustable(id)
      DX_HScroller(id)\SinusCounter=0
      For i.l=0 To DX_HScroller(id)\ScreenWidth
        If DX_HScroller(id)\SinusCounter>=DX_HScroller(id)\SinusMaxCount:DX_HScroller(id)\SinusCounter=0:EndIf
        ClipSprite(DX_HScroller(id)\id+#buffer24,i+1,0,1,DX_HScroller(id)\ScreenHeight) 
        DisplayTransparentSprite(DX_HScroller(id)\id+#buffer24,DX_HScroller(id)\XPos+i,DX_HScroller(id)\YPos+DX_HScroller(id)\SinusBuffer[DX_HScroller(id)\SinusCounter])
        DX_HScroller(id)\SinusCounter+1
        Next
     
    Default
   
  EndSelect
 
EndProcedure

;----------------------------------------------------------
; MAIN PROGRAM
;----------------------------------------------------------

OpenScreen(ScreenWidth,ScreenHeight,32,"DX_SinusScroller")

DX_InitHScroll(1,?font1,32,32,0,50,50,10,"SINUSSCROLL BY DEXTRO OF DAWN.. BUT FPS IS WAY TO SLOW",5,0)

DX_HScrollerRestoreSinusTable(1,?SinusTable,800)
DX_HScrollerSetSinusMaxCount(1,800)

Repeat
   
  ClearScreen(0)
 
  DX_GetFPS()
 
  DX_DrawHScroller(1)
 
  FlipBuffers(0)

  ExamineKeyboard()
 
Until KeyboardPushed(#PB_Key_All)
End

;----------------------------------------------------------
; DATA SECTION
;----------------------------------------------------------

DataSection
  font1:IncludeBinary "dAWN_030_32x32.PNG"
 
  SinusTable:
  Data.L 100,97,95,93,91,88,86,84,82,80,78,75,73,71,69,67
  Data.L 65,63,61,59,58,56,54,52,50,49,47,45,44,42,41,39
  Data.L 38,36,35,33,32,31,30,29,27,26,25,24,24,23,22,21
  Data.L 21,20,19,19,18,18,18,17,17,17,17,17,17,17,17,17
  Data.L 17,17,18,18,19,19,20,20,21,22,22,23,24,25,26,27
  Data.L 28,30,31,32,33,35,36,38,39,41,43,44,46,48,50,52
  Data.L 54,56,58,60,62,64,66,69,71,73,75,78,80,83,85,88
  Data.L 90,93,96,98,101,104,106,109,112,115,117,120,123,126,129,132
  Data.L 134,137,140,143,146,149,152,155,158,161,164,167,169,172,175,178
  Data.L 181,184,187,190,192,195,198,201,204,206,209,212,215,217,220,222
  Data.L 225,227,230,232,235,237,240,242,244,247,249,251,253,255,257,259
  Data.L 261,263,265,267,269,271,272,274,276,277,279,280,282,283,284,286
  Data.L 287,288,289,290,291,292,293,294,295,295,296,297,297,298,298,299
  Data.L 299,300,300,300,300,300,300,300,300,300,300,300,300,299,299,299
  Data.L 298,298,297,297,296,296,295,294,293,293,292,291,290,289,288,287
  Data.L 286,285,284,283,281,280,279,278,276,275,274,272,271,270,268,267
  Data.L 265,264,262,261,259,258,256,255,253,252,250,248,247,245,244,242
  Data.L 241,239,238,236,234,233,231,230,228,227,225,224,223,221,220,218
  Data.L 217,216,214,213,212,211,209,208,207,206,205,204,203,202,201,200
  Data.L 199,198,197,196,196,195,194,194,193,193,192,192,191,191,190,190
  Data.L 190,190,190,190,189,189,190,190,190,190,190,190,191,191,192,192
  Data.L 193,193,194,194,195,196,197,197,198,199,200,201,202,203,205,206
  Data.L 207,208,210,211,212,214,215,217,218,220,222,223,225,227,229,230
  Data.L 232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,263
  Data.L 265,267,269,271,274,276,278,280,283,285,287,289,292,294,296,298
  Data.L 301,303,305,307,310,312,314,316,318,320,322,325,327,329,331,333
  Data.L 335,337,339,341,342,344,346,348,350,351,353,355,356,358,359,361
  Data.L 362,364,365,366,367,369,370,371,372,373,374,375,376,377,377,378
  Data.L 379,379,380,380,381,381,382,382,382,382,382,382,382,382,382,382
  Data.L 382,381,381,381,380,380,379,378,378,377,376,375,374,373,372,371
  Data.L 370,369,368,366,365,363,362,360,359,357,356,354,352,350,348,346
  Data.L 344,342,340,338,336,334,332,329,327,325,322,320,317,315,312,310
  Data.L 307,305,302,299,297,294,291,289,286,283,280,277,275,272,269,266
  Data.L 263,260,257,254,251,249,246,243,240,237,234,231,228,225,222,219
  Data.L 216,214,211,208,205,202,199,197,194,191,189,186,183,181,178,175
  Data.L 173,170,168,165,163,160,158,156,153,151,149,147,145,143,141,139
  Data.L 137,135,133,131,129,127,126,124,123,121,120,118,117,115,114,113
  Data.L 112,110,109,108,107,106,106,105,104,103,103,102,101,101,100,100
  Data.L 100,99,99,99,99,99,99,99,99,99,99,99,99,100,100,100
  Data.L 101,101,102,102,103,104,104,105,106,107,108,109,110,110,112,113
  Data.L 114,115,116,117,118,119,121,122,123,125,126,127,129,130,132,133
  Data.L 134,136,137,139,140,142,144,145,147,148,150,151,153,154,156,158
  Data.L 159,161,162,164,165,167,168,170,171,173,174,176,177,179,180,181
  Data.L 183,184,185,187,188,189,190,191,193,194,195,196,197,198,199,200
  Data.L 201,201,202,203,204,204,205,206,206,207,207,208,208,208,209,209
  Data.L 209,209,209,209,210,210,209,209,209,209,209,208,208,208,207,207
  Data.L 206,206,205,204,204,203,202,201,200,199,198,197,196,195,194,193
  Data.L 191,190,189,187,186,184,183,181,180,178,176,175,173,171,170,168
  Data.L 166,164,162,160,158,156,154,152,150,148,146,144,142,140,137,135
  Data.L 133,131,129,126,124,122,120,118,115,113,111,109,106,104,102,100

EndDataSection

Here is the font which you will need to run it in purebasic

Can anybody help me optimize it or give me hints how to get it faster.

When I add the sinusscroller to an own intro, the speed s*cks  -[

1000x
DeXtr0
« Last Edit: July 19, 2007 by DeXtr0 »

Offline va!n

  • Pentium
  • *****
  • Posts: 1432
  • Karma: 109
    • View Profile
    • http://www.secretly.de
i dont know what you are doing there...  i have tried your source and PNG with PB4.10 and i only get a black screen with the fps rate... no scroller available! However, if you want draw a scroller, why are you making things so complicated and using buffers? O.O Just directly cut down the needed char, rotate this and draw it diretly on the screen and try to remove all math things you should know and where values dont change!
- hp EliteBook 8540p, 4 GB RAM, Windows 8.1 x64
- Asus P5Q, Intel Q8200, 6 GB DDR2, Radeon 4870, Windows 8.1 x64
http://www.secretly.de
Challenge Trophies Won:

Offline DeXtr0

  • C= 64
  • **
  • Posts: 79
  • Karma: 4
  • Proud member of dAWN
    • View Profile
    • dAWN Creations
Hey va!n,

wait for 30 seconds, the scroller will appear..
Cut down the character will show the old way of scrolling (char per char) => sinus char scrolling

I do clipping on each pixel of each char to get a nice Y movement for the sinus.. => sinus pixel scrolling

For the normal horizontalscroll i do already what you are saying and that is running indeed very fast.. the sinus however is hard to get faster..

For example:
GetHScrollerBitmapTextChar (tests on the character "a") to build in a stop in the x scrolling

If you have any other sinusscroll example that could help, please let me know and I restart coding all over..

1000x
DeXtr0




Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Hmm, what version of PB do I need to run it?
I have got PureBasic v3.94 (Windows - x86), I bought it as a full version so I should be able to update.. Having said that I need to get my pb account details back and my license key.
Shockwave ^ Codigos
Challenge Trophies Won:

Offline DeXtr0

  • C= 64
  • **
  • Posts: 79
  • Karma: 4
  • Proud member of dAWN
    • View Profile
    • dAWN Creations
Hey shockwave,

you need a newer version  :D

At least v4.0 even better v4.02..

Cheers,
DeXtr0

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Any chance of attaching an exe of your sinescroll to your post please? :)
Shockwave ^ Codigos
Challenge Trophies Won:

Offline DeXtr0

  • C= 64
  • **
  • Posts: 79
  • Karma: 4
  • Proud member of dAWN
    • View Profile
    • dAWN Creations
Absolutely shockwave  :D

I didn't even knew the extra option to attach files to the post ;)

It's attached, but when you executed wait a while it will come after 5 secs

Regards,
DeXtr0

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Yep, the option to attach files is there so that you can get feedback off everyone, not just the people who are interested in your chosen programming language.

I ran the file and my first thoughts are that it is quite high resolution, secondly it runs at full frame rate here, however I always have vsync enabled  (ppl who swith this of on thier cards bug the shit out of me!) and it is steady at 75 fps which is the default refresh rate of my monitor.

Another thought about it is that it seems to be rendered out of DirectX quads. Speaking as a 100% oldschool programmer who softrenders everything I have never been a fan of DX quads or GL ones either for that matter.

The reason is that these APIs work on a sub pixel level and nearly always have the odd glitch when making oldschool stuff. I can see the scroll working fine but it does have the odd glitch (not because of you, I suspect it's because of the quads).

You may get a smoother result by completely software rendering the scroller and working with it on a pixel by pixel level. As for the frame rate being slow, if it were me making this, if it was running at 800 X 600, I'd be looking to achieve about 170 - 250fps so I think it's in the right ballpark.

Shockwave ^ Codigos
Challenge Trophies Won:

Offline DeXtr0

  • C= 64
  • **
  • Posts: 79
  • Karma: 4
  • Proud member of dAWN
    • View Profile
    • dAWN Creations
Hey Shockwave,

first of all thank you in helping me out  :cheers:

The code runs in 800x600, so not really a big resolution if you ask me... and so that's why i think it's too slow..

Can you refresh my memory please (I think i'm getting old ?): What do you mean with rendered out of DirectX quads. Is this something I can change, by code..

What I currently do, and I'm not sure if you have looked at the PB code, is I clip each character pixel per pixel (well not really pixel per pixel but over the full height of the font, 1 pixel) because It needs to move on the Y axis..

I'm pretty sure It can go faster. I'm thinking for 2 weeks now how to improve it but my brains left me I think... I can't figure it out...

Cheers,
DeX

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Hmmm, well I looked through the code briefly and noticed commands like clipsprite and display sprite.

When an API like Direct X or OpenGL displays a sprite, they usually treat the square sprite as two texture mapped triangles;

Code: [Select]
___
|\  |
| \ |
|__\|


The problem is that these Api's render fragments and not pixels. They work on a sub pixel level and while that creates some really lovely anti-aliasing and beautiful 3D graphics I don't think that it's the best way of rendering 2D oldschool effects if you want total smoothness.

However, looking at your code again, that might not even be the problem, would I be right in thinking that you are drawing the scroller in a straight line and then taking that temporary buffer and then splitting it up into strips for your sine scroll?

If you are, you can save time for a start by blitting straight onto your screen.

Also what is the function of your timer?
Code: [Select]
Procedure DX_Time(id.l,time.l)
  DX_Timer(id)\postiveFlank=#False
  If  DX_Timer(id)\started=#False
    DX_Timer(id)\started=#True
    DX_Timer(id)\StartTime=ElapsedMilliseconds()
    DX_Timer(id)\StopTime=DX_Timer(id)\StartTime+time
  EndIf
  If ElapsedMilliseconds() >= DX_Timer(id)\StopTime:DX_Timer(id)\postiveFlank=#True:DX_Timer(id)\started=#False:EndIf
EndProcedure

When is that called and does it limit fps?

Forgive the stupid questions but I am a PB novice and trying to eliminate obvious things. You never know, it might point to the problem.
Shockwave ^ Codigos
Challenge Trophies Won:

Offline DeXtr0

  • C= 64
  • **
  • Posts: 79
  • Karma: 4
  • Proud member of dAWN
    • View Profile
    • dAWN Creations
Hey Shockwave,

Before I explain the use of code , that is no longer used :) I just wanted to inform you that I have started from scratch again in coding the sinusscroller..

Just 1 thing: You were right, i first drew the scroller in a straight line and then performed the clipping (which slows down)

What I do know is that , before i go in the the repeat-forever loop all my sprites are already clipped (so I gain speed).
Only the X & Y pos have to change in the loop.

As soon as it is finished I'll let you know to test a FPS :)

1000x for your help & tips,
DeXtr0

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Cool.

If I was coding one of these I would have the letters in memory somewhere as a long strip in Ascii order, I'd use Mid (or it's equivalent) to cut out a chunk of a text string and I would also usually have the sine template for that frame calculated and in memory (in an array as a series of y co-ordinates probably). from the string you chop out, you should be able to loop through letter by letter and provided that your font is fixed width it would be easy to go to the position where your letter starts.

They if your letter is 32 pixels wide, you just take vertical 32 slices and draw them at the correct position on the screen.

If PB requires you to split up all your letters into strips beforehand, it won't matter, just do so :)

Anyway, we'll be looking forward to seeing what you come up with!
Shockwave ^ Codigos
Challenge Trophies Won:

Offline DeXtr0

  • C= 64
  • **
  • Posts: 79
  • Karma: 4
  • Proud member of dAWN
    • View Profile
    • dAWN Creations
Hey Shockwave,

I recoded it competely but not yet added speed breakers (I even have not yet an idea how to do it so tips are more then :hi: )

Can you check it and give me fps ?
But be patience it takes a while before it starts because of pre-creating the clips....

Regards,
DeXtr0


Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
I tested it on my slow computer (Laptop), this computer does not even have a gfx card and it runs at about 200 fps. It's definately faster here. Btw precalc time is less than 1 second.

I suspect it will be even faster on my desktop PC.

As for timing, what screen sync commands are there in PB?
Shockwave ^ Codigos
Challenge Trophies Won:

Offline daxx

  • ZX 81
  • *
  • Posts: 15
  • Karma: 2
    • View Profile
i have 150 fps on my laptop. its much faster then before...

Offline benny!

  • Senior Member
  • DBF Aficionado
  • ********
  • Posts: 4384
  • Karma: 228
  • in this place forever!
    • View Profile
    • bennyschuetz.com - mycroBlog
@DexTro:

Your new app unfortunately crashes here right after the start. Sorry.
[ mycroBLOG - POUET :: whatever keeps us longing - for another breath of air - is getting rare ]

Challenge Trophies Won:

Offline DeXtr0

  • C= 64
  • **
  • Posts: 79
  • Karma: 4
  • Proud member of dAWN
    • View Profile
    • dAWN Creations
hey Guys,

@Shockwave: That pretty good news it is indeed much faster then before.. What screen commands you mean ? For transforming or just for flippering buffers ? Drop me a note and I'll answer it.. We can disable VSYNC (as I did here)

@Daxx: Very good news now I can finally finish the intro I was coding (when the library has this optimized code)

@Benny: I create, before starting the intro a lot of sprites dynamically (based on the length of the sinusscroller). This needs a lot of memory. How much memory you have in your system ? And do you have directX 9.0c installed ? This is what I need .. <= I just check, I need to look why it crashes....

If anybody has a tip what it could be, let me know,

DeXtr0

Offline Maxx

  • C= 64
  • **
  • Posts: 57
  • Karma: 12
    • View Profile
Just plain black screen here Geforce 7300GT.  ???
Proud Member Of Dawn Creations
Challenge Trophies Won:

Offline benny!

  • Senior Member
  • DBF Aficionado
  • ********
  • Posts: 4384
  • Karma: 228
  • in this place forever!
    • View Profile
    • bennyschuetz.com - mycroBlog
@DeXtr0:

Just downloaded it at work. Here I just have a black screen showing the FPS of about
270 (yes. I waited several seconds .. no scroller appeared).

My machine here has the following config :

Athlon 64 X2 Dual
Core Processor 4200+
2 GB RAM
GeForce 7600 GT

Don't remember my home config atm. But the machine at home isnt that bad, too.
[ mycroBLOG - POUET :: whatever keeps us longing - for another breath of air - is getting rare ]

Challenge Trophies Won:

Offline DeXtr0

  • C= 64
  • **
  • Posts: 79
  • Karma: 4
  • Proud member of dAWN
    • View Profile
    • dAWN Creations
Hey Maxx, Benny,

I recreated another EXE with a fixed bitmap text at the bottom (which should appear when the FPS are getting visible)

Can you check this one please ?


Thanks,
DeXtr0