diff --git a/cmd/mxl-player/main.go b/cmd/mxl-player/main.go index e7d5b26..d6ab880 100644 --- a/cmd/mxl-player/main.go +++ b/cmd/mxl-player/main.go @@ -462,7 +462,7 @@ func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() grant := make(chan struct{}) - staged := make(chan struct{}) + staged := make(chan uint64) go func() { for { @@ -485,7 +485,7 @@ func main() { vk.CopyToMapped(staging.Mapped, f.Payload) // fmt.Println("staged", f.Index) select { - case staged <- struct{}{}: + case staged <- f.Index: case <-ctx.Done(): return } @@ -500,7 +500,14 @@ func main() { running := true resized := false fullscreen := false + var ( + lastIndex uint64 + dropped uint64 + frameCount uint64 + lastReport time.Time + ) for running { + frameStart := time.Now() var event [128]byte for sdlPollEvent(unsafe.Pointer(&event[0])) { eventType := *(*uint32)(unsafe.Pointer(&event[0])) @@ -558,12 +565,29 @@ func main() { running = false continue } + var shownIndex uint64 select { case <-staged: case <-ctx.Done(): running = false continue } + if lastIndex != 0 && shownIndex > lastIndex { + if g := shownIndex - lastIndex - 1; g > 0 { + dropped += g + } + } + lastIndex = shownIndex + frameCount++ + if now := time.Now(); now.Sub(lastReport) >= time.Second { + dt := now.Sub(lastReport).Seconds() + fps := float64(frameCount) / dt + fmt.Printf("fps=%.1f dropped=%d idx=%d frameTime=%.2fms\n", + fps, dropped, shownIndex, float64(now.Sub(frameStart).Microseconds())/1000.0) + frameCount = 0 + dropped = 0 + lastReport = now + } // Record: copy staged V210 into device-local buffer, then clear cmd := vkCommands[0]