From e96a1fb1c76501b95420290fb87ec3749446121b Mon Sep 17 00:00:00 2001 From: Tom Lister Date: Thu, 13 Aug 2020 19:19:56 +1000 Subject: [PATCH] ebiten: Implement SetClearingScreenSkipped/IsClearingScreenSkipped (#1302) Fixes #1132 --- run.go | 24 ++++++++++++++++++++++-- uicontext.go | 8 ++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/run.go b/run.go index 239d1d542..b8698050a 100644 --- a/run.go +++ b/run.go @@ -89,8 +89,9 @@ func CurrentFPS() float64 { } var ( - isDrawingSkipped = int32(0) - currentMaxTPS = int32(DefaultTPS) + isDrawingSkipped = int32(0) + isClearingScreenSkipped = int32(0) + currentMaxTPS = int32(DefaultTPS) ) func setDrawingSkipped(skipped bool) { @@ -101,6 +102,25 @@ func setDrawingSkipped(skipped bool) { atomic.StoreInt32(&isDrawingSkipped, v) } +// SetClearingScreenSkipped enables or disables the clearing of the screen at the beginning of each frame. +// The default value is false and the screen is cleared each frame by default. +// +// SetClearingScreenSkipped is concurrent-safe. +func SetClearingScreenSkipped(skipped bool) { + v := int32(0) + if skipped { + v = 1 + } + atomic.StoreInt32(&isClearingScreenSkipped, v) +} + +// IsClearingScreenSkipped returns true if the frame isn't cleared at the beginning. +// +// IsClearingScreenSkipped is concurrent-safe. +func IsClearingScreenSkipped() bool { + return atomic.LoadInt32(&isClearingScreenSkipped) != 0 +} + // IsDrawingSkipped returns true if rendering result is not adopted. // It is recommended to skip drawing images or screen // when IsDrawingSkipped is true. diff --git a/uicontext.go b/uicontext.go index 8ce01c608..bc2355ee6 100644 --- a/uicontext.go +++ b/uicontext.go @@ -290,7 +290,9 @@ func (c *uiContext) update() error { // Multiple successive Clear call should be integrated into one graphics command, then // calling Clear on every Update should not affect the performance. - c.offscreen.Clear() + if !IsClearingScreenSkipped() { + c.offscreen.Clear() + } if err := c.game.Update(c.offscreen); err != nil { return err } @@ -306,7 +308,9 @@ func (c *uiContext) draw() { } if game, ok := c.game.(interface{ Draw(*Image) }); ok { - c.offscreen.Clear() + if !IsClearingScreenSkipped() { + c.offscreen.Clear() + } game.Draw(c.offscreen) }