mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-10 04:57:26 +01:00
ui: Sleep when vsync doesn't work (#692)
This commit is contained in:
parent
2923bec0dc
commit
25a5f1dd83
@ -625,12 +625,33 @@ func (u *userInterface) loop(g GraphicsContext) error {
|
||||
if err := u.update(g); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
u.m.Lock()
|
||||
vsync := u.vsync
|
||||
u.m.Unlock()
|
||||
|
||||
// The bound framebuffer must be the original screen framebuffer
|
||||
// before swapping buffers.
|
||||
opengl.GetContext().BindScreenFramebuffer()
|
||||
|
||||
_ = u.runOnMainThread(func() error {
|
||||
if !vsync {
|
||||
u.swapBuffers()
|
||||
return nil
|
||||
}
|
||||
|
||||
n1 := time.Now().UnixNano()
|
||||
u.swapBuffers()
|
||||
n2 := time.Now().UnixNano()
|
||||
d := time.Duration(n2 - n1)
|
||||
|
||||
// On macOS Mojave, vsync might not work (#692).
|
||||
// As a tempoarry fix, just wait for a millisecond not to consume CPU too much.
|
||||
const threshold = 4 * time.Millisecond // 250 [Hz]
|
||||
if d < threshold {
|
||||
time.Sleep(threshold - d)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
}
|
||||
|
3
run.go
3
run.go
@ -38,6 +38,9 @@ const FPS = DefaultTPS
|
||||
// CurrentFPS returns the current number of FPS (frames per second), that represents
|
||||
// how many swapping buffer happens per second.
|
||||
//
|
||||
// On some environments, CurrentFPS doesn't return a reliable value since vsync doesn't work well there.
|
||||
// If you want to measure the application's speed, Use CurrentTPS.
|
||||
//
|
||||
// CurrentFPS is concurrent-safe.
|
||||
func CurrentFPS() float64 {
|
||||
return clock.CurrentFPS()
|
||||
|
Loading…
Reference in New Issue
Block a user