package play import ( "fmt" "time" "opslag.de/schobers/geom" "opslag.de/schobers/zntg" "opslag.de/schobers/zntg/ui" ) type FPS struct { ui.ControlBase Align ui.HorizontalAlignment update zntg.Animation i int frames []int total int } func (f *FPS) Shown() { f.update.Interval = 20 * time.Millisecond f.update.Start() f.i = 0 f.frames = make([]int, 51) f.total = 0 } func (f *FPS) Hidden() { f.update.Pause() } func (f *FPS) font(ctx ui.Context) ui.Font { font := ctx.Fonts().Font("debug") if font != nil { return font } return ctx.Fonts().Font("default") } func (f *FPS) Render(ctx ui.Context) { _, n := f.update.AnimateDelta() for i := 0; i < n; i++ { f.total += f.frames[f.i] f.i = (f.i + 1) % len(f.frames) f.total -= f.frames[f.i] f.frames[f.i] = 0 } f.frames[f.i]++ font := f.font(ctx) fps := fmt.Sprintf("FPS: %d", f.total) renderer := ctx.Renderer() switch f.Align { case ui.AlignLeft: ctx.Renderer().Text(font, geom.PtF32(5, 5), ctx.Style().Palette.Background, fps) ctx.Renderer().Text(font, geom.PtF32(4, 4), ctx.Style().Palette.Text, fps) case ui.AlignCenter: center := .5 * renderer.Size().ToF32().X ctx.Renderer().TextAlign(font, geom.PtF32(center, 5), ctx.Style().Palette.Background, fps, ui.AlignCenter) ctx.Renderer().TextAlign(font, geom.PtF32(center+1, 4), ctx.Style().Palette.Text, fps, ui.AlignCenter) case ui.AlignRight: right := renderer.Size().ToF32().X - 5 ctx.Renderer().TextAlign(font, geom.PtF32(right, 5), ctx.Style().Palette.Background, fps, ui.AlignRight) ctx.Renderer().TextAlign(font, geom.PtF32(right+1, 4), ctx.Style().Palette.Text, fps, ui.AlignRight) } }