From 902582a27447a41215d8fa393a0736d905f324c8 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 11 Dec 2023 17:55:50 +0100 Subject: [PATCH] feat: optimize image allocations --- crt.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/crt.go b/crt.go index fa2e2f3..ffa29d3 100644 --- a/crt.go +++ b/crt.go @@ -60,6 +60,8 @@ type Window struct { bgColors *image.RGBA shader []shader.Shader routine sync.Once + shaderByteBuffer []byte + shaderBuffer *ebiten.Image lastBuffer *ebiten.Image invalidateBuffer bool } @@ -105,6 +107,7 @@ func NewGame(width int, height int, fonts Fonts, tty io.Reader, adapter InputAda grid: grid, tty: tty, bgColors: image.NewRGBA(image.Rect(0, 0, cellsWidth*cellWidth, cellsHeight*cellHeight)), + lastBuffer: ebiten.NewImage(cellsWidth*cellWidth, cellsHeight*cellHeight), cursorChar: "█", cursorColor: color.RGBA{R: 255, G: 255, B: 255, A: 100}, onUpdate: func() {}, @@ -550,9 +553,7 @@ func (g *Window) Draw(screen *ebiten.Image) { bufferImage := g.lastBuffer // Only draw the buffer if it's invalid - if bufferImage == nil || g.invalidateBuffer { - bufferImage = ebiten.NewImage(g.cellsWidth*g.cellWidth, g.cellsHeight*g.cellHeight) - + if g.invalidateBuffer { // Draw background bufferImage.WritePixels(g.bgColors.Pix) @@ -585,13 +586,22 @@ func (g *Window) Draw(screen *ebiten.Image) { // Draw shader if g.shader != nil { - shaderBuffer := ebiten.NewImageFromImage(bufferImage) + if g.shaderBuffer == nil { + g.shaderBuffer = ebiten.NewImageFromImage(bufferImage) + } else { + bounds := g.shaderBuffer.Bounds() + if len(g.shaderByteBuffer) < 4*bounds.Dx()*bounds.Dy() { + g.shaderByteBuffer = make([]byte, 4*bounds.Dx()*bounds.Dy()) + } + bufferImage.ReadPixels(g.shaderByteBuffer) + g.shaderBuffer.WritePixels(g.shaderByteBuffer) + } for i := range g.shader { - _ = g.shader[i].Apply(screen, shaderBuffer) + _ = g.shader[i].Apply(screen, g.shaderBuffer) if len(g.shader) > 0 { - shaderBuffer.DrawImage(screen, nil) + g.shaderBuffer.DrawImage(screen, nil) } } } else {