October 28, 2020, 11:23:24 PM

Author Topic: determine entity to update next depending on milli values  (Read 825 times)

Offline RemiD

  • Hero Member
  • *****
  • Posts: 1065
determine entity to update next depending on milli values
« on: September 13, 2019, 09:16:03 PM »
Code: [Select]
;determine entity to update next depending on milli values
;imagine you have to update the lighting shading, or the shadow caster, or the shadow, or a special effect like glow, on all turning moving animating entities of a scene, it may take too much time to do that each frame for all entities.
;however, using milli values, you can determine which was the entity which was updated the longest time ago, and only update this entity this frame. (or several, as you want...)
Graphics3D(854,480,32,2)

SeedRnd(MilliSecs())

Global X16Font = LoadFont("System",16,False,False,False)

Global EntitiesCount%
Dim EntityMilli%(10)

;to store the temps indexes, properties
Global TempsCount%
Dim TempI%(100)
Dim TempValue%(100)
Dim TempState%(100)

;to order values (from lowest to highest or from heighest to lowest)
Global OrderedsCount%
Dim OrderedI%(100)
Dim OrderedValue%(100)

For n% = 1 To 10 Step 1
 EntitiesCount = EntitiesCount + 1 : EI% = EntitiesCount
 EntityMilli(EI) = -2147483647+Rand(1,1000)
Next

Global DebugImage = CreateImage(300,16*25)

Global MainLoopTimer = CreateTimer(30)

Main()

End()

Function Main()

 Repeat

  MainLoopMilliStart% = MilliSecs()

  If( KeyHit(57)=1 ) ;key space
   SetBuffer(ImageBuffer(DebugImage))
   ClsColor(010,010,010) : Cls()
   SetFont(X16Font) : Color(255,255,255)
   PX% = 0 : PY% = -16
   ;list all entities in area and in view
   TempsCount = 0
   For EI% = 1 To EntitiesCount Step 1
    TempsCount = TempsCount + 1 : TI% = TempsCount
    TempI(TI) = EI
    TempValue(TI) = EntityMilli(EI)
    TempState(TI) = True
   Next
   PX% = 0 : PY% = PY+16 : TStr$ = "listed values : " : CText(TStr,PX,PY)
   For TI% = 1 To TempsCount Step 1
    PX% = 0 : PY% = PY+16 : TStr$ = TempValue(TI) : CText(TStr,PX,PY)
   Next
   ;order the listed entities by Milli values (from lowest to highest)
   MaxLoops% = TempsCount
   Loops% = 0
   OrderedsCount = 0
   While( Loops < MaxLoops )
    Loops = Loops + 1
    SValue% = 2147483647-1
    SI% = 0
    For TI% = 1 To TempsCount Step 1
     If( TempState(TI) = True )
      If( TempValue(TI) < SValue )
       SI = TI
       SValue = TempValue(TI)
      EndIf
     EndIf
    Next
    TempState(SI) = False
    OrderedsCount = OrderedsCount + 1 : OI% = OrderedsCount
    OrderedValue(OI) = SValue
    OrderedI(OI) = SI
   Wend
   PX% = 0 : PY% = PY+16 : TStr$ = "" : CText(TStr,PX,PY)
   PX% = 0 : PY% = PY+16 : TStr$ = "ordered values : " : CText(TStr,PX,PY)
   For OI% = 1 To OrderedsCount Step 1
    PX% = 0 : PY% = PY+16 : TStr$ = OrderedValue(OI) : CText(TStr,PX,PY)
   Next
   ;choose the lowest Milli value and the corresponding entity
   OI% = 0
   OI = OI + 1
   If( OI <= OrderedsCount )
    SValue = OrderedValue(OI) : SI% = OrderedI(OI)   
    EI% = TempI(SI)
    PX% = 0 : PY% = PY+16 : TStr$ = "" : CText(TStr,PX,PY)
    PX% = 0 : PY% = PY+16 : TStr$ = "entity to update : "+EI : CText(TStr,PX,PY)
    ;update this entity
    ;
    ;update Milli value of entity
    EntityMilli(EI) = MilliSecs()
   EndIf
  EndIf

  SetBuffer(BackBuffer())
  ClsColor(000,000,000) : Cls()

  DrawImage(DebugImage,GraphicsWidth()/2-ImageWidth(DebugImage)/2,GraphicsHeight()/2-ImageHeight(DebugImage)/2)

  SetFont(X16Font) : Color(255,255,255)
  CText("FPS = "+FPS,0,0)

  ;Flip(1)
  WaitTimer(MainLoopTimer)
  VWait():Flip(False)

  MainLoopMilliTime = MilliSecs() - MainLoopMilliStart
  If( MainLoopMilliTime < 1 )
   MainLoopMilliTime = 1
  EndIf

  FPS% = 1000.0/MainLoopMilliTime

 Until( KeyDown(1)=1 )

End Function

Function CText(TextStr$,PX%,PY%)

 Text(PX,PY,TextStr,False,False)

End Function
DualCore AMD E-450, 1646 MHz - 6 Go DDR3 1333 SDRAM - AMD Radeon HD 6320 Graphics (384 Mo) - Windows 7 Home Premium - DirectX 11.0

Offline Santiago

  • Sr. Member
  • ****
  • Posts: 276
  • Blitz3d
    • Indiesoft
Re: determine entity to update depending on milli values
« Reply #1 on: September 13, 2019, 10:51:41 PM »
Thanks for sharing!!!! i studying this code...

Offline RemiD

  • Hero Member
  • *****
  • Posts: 1065
Re: determine entity to update depending on milli values
« Reply #2 on: September 15, 2019, 10:13:09 AM »
related to this : https://www.syntaxbomb.com/index.php/topic,4366.0.html (solution in post #8 #15)
DualCore AMD E-450, 1646 MHz - 6 Go DDR3 1333 SDRAM - AMD Radeon HD 6320 Graphics (384 Mo) - Windows 7 Home Premium - DirectX 11.0

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal