package Ġorg . hex works . z ir con . internal . application Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Supervisor Job Ċ import Ġkotlinx . coroutines . as Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . cancel Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . hex works . cob alt . logging . api . LoggerFactory Ċ import Ġorg . hex works . z ir con . api . application . AppConfig Ċ import Ġorg . hex works . z ir con . api . application . Application Ċ import Ġorg . hex works . z ir con . internal . Run Time Stats Ċ import Ġorg . hex works . z ir con . internal . renderer . Renderer Ċ import Ġorg . hex works . z ir con . platform . util . System Utils Ċ import Ġjava . util . concurrent . Executors Ċ Ċ abstract Ġclass ĠBase Application ( private Ġval Ġapp Config : ĠApp Config ) Ġ: ĠApplication , ĠCor outine Scope Ġ{ ĊĊĠĠĠ Ġabstract Ġval Ġrenderer : ĠRenderer ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context Ġ= ĠExec utors . new Single Thread Executor (). as Coroutine Dispatcher () Ġ+ ĠSuper visor Job () ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( this :: class ) ĊĠĠĠ Ġprivate Ġval Ġrender Interval Ġ= Ġ 1 0 0 0 . div ( app Config . fps Limit ) ĊĊĠĠĠ Ġprivate Ġvar Ġstopped Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġrunning Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġpaused Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġlast Render Ġ= Ġ 0 L ĊĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! stopped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! stopped Ġ&& Ġrunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( paused . not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem Utils . getCurrent Time Ms () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( now Ġ- Ġlast Render Ġ> Ġrender Interval ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Rendering Ġbecause Ġnow : Ġ$ now Ġ- Ġlast Ġrender : Ġ$ last Render Ġ> Ġrender Ġinterval : Ġ$ render Interval .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Render () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Render Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Render Ġfailed ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġpaused Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresume () Ġ{ ĊĠĠĠĠĠĠĠ Ġpaused Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġstopped Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġrunning Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġrenderer . close () ĊĠĠĠĠĠĠĠ Ġtile Grid . close () ĊĠĠĠĠĠĠĠ Ġcoroutine Context . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Render () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( app Config . debug Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRun Time Stats . add Timed Stat For (" debug . render . time ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . render () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . render () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ