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) }