diff --git a/.travis.yml b/.travis.yml index 032e57fe2..fd5987c11 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,10 +28,15 @@ install: - cd /tmp/work - go mod init example.com/m - go get github.com/hajimehoshi/ebiten@$TRAVIS_BRANCH - - # gopath-get for the current GopherJS and gjbt. + - # GopherJS - GO111MODULE=off go get -tags example github.com/hajimehoshi/ebiten/... - GO111MODULE=off go1.12.9 get github.com/gopherjs/gopherjs + - # gjbt - GO111MODULE=off go1.12.9 get myitcv.io/cmd/gjbt + - # wasmbrowsertest + - go get github.com/agnivade/wasmbrowsertest + - mv $GOPATH/bin/wasmbrowsertest $GOPATH/bin/go_js_wasm_exec + - # Chrome - mkdir /tmp/google-chrome-bin - ln -s /usr/bin/google-chrome-stable /tmp/google-chrome-bin/google-chrome - export PATH=/tmp/google-chrome-bin:$PATH @@ -46,6 +51,7 @@ script: - cd /tmp/work - go build -tags example -v github.com/hajimehoshi/ebiten/... - go test -v github.com/hajimehoshi/ebiten/... + - GOOS=js GOARCH=wasm go test -v github.com/hajimehoshi/ebiten/... - GOOS=windows GOARCH=amd64 go build -tags example -v github.com/hajimehoshi/ebiten/... - GOOS=windows GOARCH=386 go build -tags example -v github.com/hajimehoshi/ebiten/... - GO111MODULE=off go1.12.9 run github.com/gopherjs/gopherjs build --tags example -v github.com/hajimehoshi/ebiten/examples/blocks diff --git a/internal/graphicsdriver/opengl/context_js.go b/internal/graphicsdriver/opengl/context_js.go index cea03623f..7c5c714da 100644 --- a/internal/graphicsdriver/opengl/context_js.go +++ b/internal/graphicsdriver/opengl/context_js.go @@ -90,6 +90,11 @@ var ( unsignedShort = contextPrototype.Get("UNSIGNED_SHORT") ) +// temporaryBuffer is a temporary buffer used at gl.readPixels. +// The read data is converted to Go's byte slice as soon as possible. +// To avoid often allocating ArrayBuffer, reuse the buffer whenever possible. +var temporaryBuffer = js.Global().Get("ArrayBuffer").New(16) + type contextImpl struct { gl js.Value lastProgramID programID @@ -191,7 +196,14 @@ func (c *context) framebufferPixels(f *framebuffer, width, height int) ([]byte, c.bindFramebuffer(f.native) - p := js.Global().Get("Uint8Array").New(4 * width * height) + l := 4 * width * height + if bufl := temporaryBuffer.Get("byteLength").Int(); bufl < l { + for bufl < l { + bufl *= 2 + } + temporaryBuffer = js.Global().Get("ArrayBuffer").New(bufl) + } + p := js.Global().Get("Uint8Array").New(temporaryBuffer, 0, l) gl.Call("readPixels", 0, 0, width, height, rgba, unsignedByte, p) return jsutil.Uint8ArrayToSlice(p), nil