package Ġcom . so y wiz . k orge . view Ċ Ċ import Ġcom . so y wiz . k ds .* Ċ import Ġcom . so y wiz . k lock .* Ċ import Ġcom . so y wiz . k mem . convert Range Ċ import Ġcom . so y wiz . k orge . bitmap font .* Ċ import Ġcom . so y wiz . k orge . render .* Ċ import Ġcom . so y wiz . k orge . scene .* Ċ import Ġcom . so y wiz . kor im . color .* Ċ import Ġcom . so y wiz . k orm a . math .* Ċ Ċ internal Ġfun ĠViews Container . install F ps Debug Overlay () Ġ{ ĊĠĠĠ Ġval Ġlong Window Ġ= ĠTime Sl iding Window ( 2 4 0 ) ĊĠĠĠ Ġval Ġmedium Window Ġ= ĠTime Sl iding Window ( 6 0 ) ĊĠĠĠ Ġval Ġshort Window Ġ= ĠTime Sl iding Window ( 1 0 ) ĊĊĠĠĠ Ġvar Ġprevious Time Ġ= ĠPerformance Counter . reference ĊĠĠĠ Ġvar Ġframes Ġ= Ġ 0 ĊĊĠĠĠ Ġviews . add Debug Renderer Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġctx . ag . device Pixel Ratio ĊĊĠĠĠĠĠĠĠ Ġval ĠfontSize Ġ= Ġ 8 . 0 Ġ* Ġscale ĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= ĠPerformance Counter . reference ĊĠĠĠĠĠĠĠ Ġval Ġelapsed Time Ġ= Ġ( currentTime Ġ- Ġprevious Time ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( frames Ġ> Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ@ TODO : ĠWe Ġare Ġdiscard ing Ġfor Ġnow Ġtoo Ġlow Ġvalues . ĠWe Ġhave Ġto Ġcheck Ġwhy Ġthis Ġhappening . ĠMaybe Ġbecause Ġv sync Ġis Ġnear ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elapsed Time Ġ> Ġ 4 . milliseconds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Window . add ( elapsed Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedium Window . add ( elapsed Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshort Window . add ( elapsed Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġframes ++ ĊĠĠĠĠĠĠĠ Ġprevious Time Ġ= ĠcurrentTime ĊĊĠĠĠĠĠĠĠ Ġfun Ġdraw Text With Shadow ( text : ĠString , Ġx : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . draw Text ( debug B mp Font , ĠfontSize , Ġtext , Ġx Ġ= Ġx Ġ+ Ġ 1 , Ġy Ġ= Ġy Ġ+ Ġ 1 , Ġcol Mul Ġ= ĠColors . BLACK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . draw Text ( debug B mp Font , ĠfontSize , Ġtext , Ġx Ġ= Ġx , Ġy Ġ= Ġy , Ġcol Mul Ġ= ĠColors . WHITE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdraw Text With Shadow (" FPS : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ short Window . avg F ps . round Decimal Places ( 1 )}, Ġrange : Ġ[" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ medium Window . min F ps . round Decimal Places ( 1 )} -" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ medium Window . max F ps . round Decimal Places ( 1 )} ]", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgraph Left Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġval Ġgraph Top Ġ= Ġ( fontSize Ġ* Ġ 2 ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġoverlay Lines Ġ= Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġoverlay Width Ġ= Ġ 1 2 0 f Ġ* Ġscale . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġoverlay Height Ġ= Ġ 3 0 Ġ* Ġscale ĊĠĠĠĠĠĠĠ Ġval Ġoverlay Height Gap Ġ= Ġ 5 . 0 ĊĊĠĠĠĠĠĠĠ Ġrender Context . debug Line Render Context . color ( Colors . YELLOW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġy - axis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Context . debug Line Render Context . line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Left , Ġgraph Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Left , Ġgraph Top Ġ+ Ġoverlay Height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġx - axis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Context . debug Line Render Context . line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Left , Ġgraph Top Ġ+ Ġoverlay Height . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Left Ġ+ Ġoverlay Width , Ġgraph Top Ġ+ Ġoverlay Height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrender Context . debug Line Render Context . color ( Colors . WHITE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġratio Ġ= Ġlong Window . size . toDouble () Ġ/ Ġlong Window . capacity . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Overlay Lines Ġ= Ġ( overlay Lines Ġ* Ġratio ). toInt (). coerce At Least ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( long Window . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprevious X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprevious Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin F ps Ġ= Ġlong Window . min F ps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax F ps Ġ= Ġlong Window . max F ps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġtotal Overlay Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCompute Ġfps Ġsample ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfps Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 0 Ġ= Ġn . convert Range ( 0 , Ġtotal Overlay Lines , Ġ 0 , Ġlong Window . size . coerce At Least ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġ( n Ġ+ Ġ 1 ). convert Range ( 0 , Ġtotal Overlay Lines , Ġ 0 , Ġlong Window . size . coerce At Least ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpl en Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtime Sum Ġ= Ġ 0 . milliseconds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġp 0 Ġuntil Ġp 1 . coerce At Most ( long Window . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Sum Ġ+= Ġlong Window [ m ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl en ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pl en Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Sum Ġ+= Ġlong Window [ p 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl en ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġ( time Sum Ġ/ Ġpl en . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfps Ġ= Ġtime . to Frequency (). h ert z ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// print ("$ fps [$ p 0 ,$ p 1 ] {$ min F ps ,$ max F ps }, ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscaled Freq Ġ= Ġfps . convert Range ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin F ps , Ġmax F ps , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Height Gap , Ġoverlay Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġ( graph Top Ġ+ Ġoverlay Height Ġ- Ġscaled Freq ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġgraph Left Ġ+ Ġ( n . toFloat () Ġ* Ġoverlay Width Ġ/ Ġoverlay Lines . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Context . debug Line Render Context . line ( previous X , Ġprevious Y , Ġx , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠTime Sl iding Window ( val Ġcapacity : ĠInt ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdeque Ġ= ĠInt Deque ( capacity ) ĊĠĠĠ Ġprivate Ġvar Ġtotal Micro seconds Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġsize Ġget () Ġ= Ġdeque . size ĊĊĠĠĠ Ġval Ġavg : ĠTimeSpan Ġget () Ġ= Ġ( total Micro seconds . toDouble () Ġ/ Ġdeque . size ). micro seconds ĊĠĠĠ Ġ// Ġ@ TODO : ĠCan Ġwe Ġcompute Ġthis Ġincrement ally ? ĊĠĠĠ Ġval Ġmin : ĠTimeSpan Ġget () Ġ= Ġdeque . min ()?. micro seconds Ġ?: Ġ 1 . micro seconds ĊĠĠĠ Ġval Ġmax : ĠTimeSpan Ġget () Ġ= Ġdeque . max ()?. micro seconds Ġ?: Ġ 1 . micro seconds ĊĊĠĠĠ Ġval Ġavg F ps : ĠDouble Ġget () Ġ= Ġ 1 . seconds Ġ/ Ġavg ĊĠĠĠ Ġval Ġmin F ps : ĠDouble Ġget () Ġ= Ġ 1 . seconds Ġ/ Ġmax ĊĠĠĠ Ġval Ġmax F ps : ĠDouble Ġget () Ġ= Ġ 1 . seconds Ġ/ Ġmin ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ): ĠTimeSpan Ġ= Ġdeque [ index ]. micro seconds ĊĊĠĠĠ Ġfun Ġadd ( value : ĠTimeSpan ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġint Value Ġ= Ġvalue . micro seconds Int ĊĠĠĠĠĠĠĠ Ġdeque . add ( intValue ) ĊĠĠĠĠĠĠĠ Ġtotal Micro seconds Ġ+= Ġint Value ĊĠĠĠĠĠĠĠ Ġif Ġ( deque . size Ġ> Ġcapacity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Micro seconds Ġ-= Ġdeque . remove First () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ