From 5a1099db27ff36cb3cbbb1022b5f8c5f78869dcd Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sat, 23 Apr 2016 01:34:02 +0900 Subject: [PATCH] examples/alphablending: Refactoring: Reduce draw calls --- examples/alphablending/main.go | 55 ++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/examples/alphablending/main.go b/examples/alphablending/main.go index d9f0f9968..13d6e4aa0 100644 --- a/examples/alphablending/main.go +++ b/examples/alphablending/main.go @@ -29,11 +29,30 @@ const ( ) var ( - count int - tmpRenderTarget *ebiten.Image - ebitenImage *ebiten.Image + count int + ebitenImage *ebiten.Image ) +type imageParts struct { + diff float64 +} + +func (p *imageParts) Src(i int) (int, int, int, int) { + w, h := ebitenImage.Size() + return 0, 0, w, h +} + +func (p *imageParts) Dst(i int) (int, int, int, int) { + x := int(float64(i%10)*p.diff + 15) + y := int(float64(i/10)*p.diff + 20) + w, h := ebitenImage.Size() + return x, y, x + w, y + h +} + +func (p *imageParts) Len() int { + return 10 * 10 +} + func update(screen *ebiten.Image) error { count++ count %= ebiten.FPS * 10 @@ -45,27 +64,15 @@ func update(screen *ebiten.Image) error { diff = float64(480-count) * 0.2 } - if err := tmpRenderTarget.Clear(); err != nil { + screen.Fill(color.NRGBA{0x00, 0x00, 0x80, 0xff}) + op := &ebiten.DrawImageOptions{} + op.ColorM.Scale(1.0, 1.0, 1.0, 0.5) + op.ImageParts = &imageParts{ + diff: diff, + } + if err := screen.DrawImage(ebitenImage, op); err != nil { return err } - for i := 0; i < 10; i++ { - op := &ebiten.DrawImageOptions{} - op.GeoM.Translate(15+float64(i)*diff, 20) - op.ColorM.Scale(1.0, 1.0, 1.0, 0.5) - if err := tmpRenderTarget.DrawImage(ebitenImage, op); err != nil { - return err - } - } - - screen.Fill(color.NRGBA{0x00, 0x00, 0x80, 0xff}) - for i := 0; i < 10; i++ { - op := &ebiten.DrawImageOptions{} - op.GeoM.Translate(0, float64(i)*diff) - if err := screen.DrawImage(tmpRenderTarget, op); err != nil { - return err - } - } - return nil } @@ -75,10 +82,6 @@ func main() { if err != nil { log.Fatal(err) } - tmpRenderTarget, err = ebiten.NewImage(screenWidth, screenHeight, ebiten.FilterNearest) - if err != nil { - log.Fatal(err) - } if err := ebiten.Run(update, screenWidth, screenHeight, 2, "Alpha Blending (Ebiten Demo)"); err != nil { log.Fatal(err) }