hajimehoshi / ebiten

Ebitengine - A dead simple 2D game engine for Go
https://ebitengine.org
Apache License 2.0
10.98k stars 657 forks source link

internal/graphicscommand: optimize `prependPreservedUniforms` #3144

Open hajimehoshi opened 1 day ago

hajimehoshi commented 1 day ago

Operating System

What feature would you like to be added?

prependPreservedUniforms tends to be a hot spot for performance, especially when rendering a lot of sprites. Here is the profiling result of examples/sprites with 10000 sprites:

image

atlas.Image.drawTriangles is the heaviest process, but this does a little complicated things. Let's focus on prependPreservedUniforms.

There are some ideas to optimize this.

Why is this needed?

No response

hajimehoshi commented 1 day ago

BCE result:

% go build -gcflags=-d=ssa/check_bce ./internal/graphicscommand
# github.com/hajimehoshi/ebiten/v2/internal/graphicscommand
internal/graphicscommand/command.go:51:17: Found IsSliceInBounds
internal/graphicscommand/command.go:228:16: Found IsInBounds
internal/graphicscommand/command.go:229:16: Found IsInBounds
internal/graphicscommand/image.go:179:28: Found IsInBounds
internal/graphicscommand/image.go:183:28: Found IsInBounds
internal/graphicscommand/image.go:185:62: Found IsSliceInBounds
internal/graphicscommand/image.go:217:7: Found IsInBounds
internal/graphicscommand/image.go:234:16: Found IsInBounds
internal/graphicscommand/image.go:234:31: Found IsInBounds
internal/graphicscommand/commandqueue.go:139:23: Found IsInBounds
internal/graphicscommand/commandqueue.go:180:19: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:264:14: Found IsInBounds
internal/graphicscommand/commandqueue.go:275:17: Found IsInBounds
internal/graphicscommand/commandqueue.go:297:43: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:297:52: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:300:11: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:301:11: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:304:23: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:326:10: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:351:15: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:367:11: Found IsInBounds
internal/graphicscommand/commandqueue.go:368:11: Found IsInBounds
internal/graphicscommand/commandqueue.go:409:11: Found IsInBounds
internal/graphicscommand/commandqueue.go:410:11: Found IsInBounds
internal/graphicscommand/commandqueue.go:416:11: Found IsInBounds
internal/graphicscommand/commandqueue.go:417:11: Found IsInBounds
internal/graphicscommand/commandqueue.go:461:14: Found IsInBounds
internal/graphicscommand/commandqueue.go:463:19: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:536:10: Found IsSliceInBounds
internal/graphicscommand/image_notjs.go:100:14: Found IsSliceInBounds
internal/graphicscommand/command.go:247:53: Found IsInBounds
internal/graphicscommand/command.go:248:53: Found IsInBounds
internal/graphicscommand/commandqueue.go:138:36: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:152:37: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:155:29: Found IsSliceInBounds
internal/graphicscommand/commandqueue.go:350:34: Found IsSliceInBounds