Willow vs Raw Ebitengine

Willow builds on Ebitengine. It doesn't replace it. This page shows what Willow layers on top, so you can decide whether it fits your project.

Feature Comparison

FeatureRaw EbitengineWith Willow
Draw orderingManual (you sort)Display tree with z-index
Sprite batchingManual (DrawImage calls)Automatic with atlas support
Camera / viewportManual matrix mathCamera object with follow, scroll, culling
Text renderingBasic (text/v2 package)SDF + bitmap, multi-style FontFamily
Input / hit testingGlobal input pollingHierarchical hit testing per node
ParticlesBuild your ownCPU particle emitters
Shaders / filtersRaw Kage shadersComposable filter chains
Tile mapsBuild your ownOptimized tile map renderer
Animation / tweeningBuild your own45+ easing functions
Performance toolsBuild your ownDebug overlay, FPS widget, subtree caching

Side by Side

Drawing a Positioned, Rotated Sprite

Raw Ebitengine
Willow

Camera Following a Player

Raw Ebitengine
Willow

Layered Scene with UI on Top

Raw Ebitengine
Willow

Performance Impact

For most projects, Willow adds negligible overhead. For large scenes, it can actually be faster than naive raw Ebitengine because of automatic batching and subtree caching.

~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)

If you're drawing fewer than 50 sprites with no camera, raw Ebitengine is perfectly fine. Willow pays for itself when you need structure: layering, cameras, batching, or input routing.

When You Don't Need Willow

Raw Ebitengine is fine for

  • Very simple games with a handful of sprites
  • Projects that need a fully custom rendering pipeline
  • Learning Ebitengine itself (start raw, add Willow when you feel the pain)
  • Non-game applications that just need a window and basic drawing

Willow helps when you need

  • Structured scene management with parent/child relationships
  • Cameras, viewports, and frustum culling
  • Automatic sprite batching for performance
  • Text rendering, particles, shaders, or tile maps
  • Hierarchical input handling and hit testing