Why Willow?

A display-tree rendering framework that sits between your game and Ebitengine's GPU backend. Scene graph, sprite batching, cameras, text, particles, and shaders. All in Go.

Blendmode effectsBlendmode Effects
Nested transformsNested Transforms
Pixel-drawn offscreen renderingOffscreen Pixel Rendering
Mesh effectsRope Mesh Effects

The Rendering Gap in Ebitengine

Ebitengine gives you a game loop and a screen to draw on. Everything above that is your problem.

Every project starts by rebuilding the same infrastructure: draw ordering, camera transforms, sprite management, text layout, input routing. It works, but it's the same boilerplate every time.

This is the same gap PixiJS filled for HTML5 Canvas, and Starling filled for Flash. A structured rendering layer between your game logic and the low-level draw calls. Willow fills that gap for Ebitengine.

What Willow Gives You

Display Tree

Parent/child scene graph with automatic transform inheritance, alpha propagation, and z-index ordering.

Sprite Batching

Automatic draw call batching with TexturePacker atlas support. Thousands of sprites in a handful of draw calls.

Cameras & Viewports

Multiple viewports with frustum culling, follow targets, and scroll-to animation.

Text Rendering

SDF font rendering with multi-style FontFamily support. PixelFont for crisp bitmap text.

Particles

CPU-simulated particle emitters with configurable lifetime, gravity, and interpolation.

Shaders & Filters

Composable Kage shader filter chains. Blur, outline, palette swap, color matrix, and custom filters.

Hit Testing

Hierarchical input handling with rect, circle, and polygon hit shapes. Event callbacks for pointer, touch, and keyboard.

Tile Maps

Efficient large-world tile map rendering with animated tile UV swaps.

2D Lighting

2D lighting layer with erase-blend render targets for dynamic light and shadow.

Animation

Tweening with 45+ easing functions for position, scale, rotation, alpha, and color.

Raw Ebitengine vs Willow

Drawing a positioned, rotated sprite with a camera offset.

Raw Ebitengine
Willow

Willow handles origin centering, transform composition, and camera projection for you. You describe what your scene looks like; Willow figures out how to draw it.

Built for Performance

Zero heap allocations per frame on the hot path. 10,000 sprites at 120+ FPS on desktop, 60+ FPS on mobile and WebAssembly.

~39 µs10K sprites, cached + camera scrolling~125x faster
~1.97 ms10K sprites, 100 animated tile UV swaps~2.5x faster
~4.0 ms10K sprites, 1% children moving (auto)~1.2x faster
~4.9 ms10K sprites, no cache (baseline)

Static content caching delivers up to 125x speedups. Automatic render batching reduces draw calls. Frustum culling skips off-screen objects entirely.

Is Willow Right for Your Project?

Great for

  • 2D games requiring structured layering and scene composition
  • Large tile map worlds with cameras and scrolling
  • Game tooling, level editors, and debug overlays
  • Rapid prototyping with minimal setup
  • Creative coding, generative art, and audio visualizers
  • Cross-platform desktop utilities with rich 2D graphics

Not designed for

  • Not a full game engine. No built-in physics, networking, or asset pipelines.
  • Not a UI layout framework. Willow UI is a separate companion library for that.
  • Not a replacement for Ebitengine. It builds on top of it.

Compare Willow

Want a closer look at how Willow stacks up? See side-by-side code comparisons and feature breakdowns:

  • Willow vs Raw Ebitengine — what Willow adds on top of Ebitengine's core, with code comparisons for common tasks.
  • Willow vs PixiJS — concept mapping for developers coming from PixiJS. Same patterns, different language.