Ebiten 2.2 Release Notes


Issues for v2.2.0

Nintendo Switch™

Ebiten now supports Nintendo Switch. For more information, please see Nintendo Developer Portal, the portal site for Nintendo platform developers.

Audio reimplementation


The audio implementaiton was much improved to have a bigger buffer for each player. Delays and noises should be reduced.

Standard gamepad layout mappings


Until v2.1, Ebiten's gamepad button and axis assignments varied among gamepads and environments. For example, a gamepad button number 1 might indicate a different physical button in another environment. It was hard to keep poratbility with gamepads.

Ebiten v2.2 adopted the standard gamepad layout in the Web standard. The standard gamepad layout is a model for modern gamepads like Xbox, PlayStation and Nintendo Switch. The standard gamepad layout assumes these buttons or axes:

The standard gamepad layout

The standard gamepad layout

If the standard gamepad layout is available for your gamepad in your environment, you can use APIs for standard gamepads like StandardGamepadButton. You don't have to worry about the button/axis assignment differences.

On desktops, SDL's gamepad database is used. On browsers, browsers' standard mappings are used. On mobiles, mappings are not available yet.

Unfortunately, not all gamepads have mappings for the standard gamepad layout. Use the existing APIs for unsupported gamepads.

For actual usages, see examples/gamepad.

New vector graphics APIs


A screenshot of examples/vector

A screenshot of examples/vector

Vector graphics APIs in Ebiten were redesigned and reimplemented with stencil buffers.

A member FillMode is added to ebiten.DrawTrianglesOptions. The fill mode ebiten.EvenOdd indicates a rule how an overlapped region is rendered. By combining this and a new function AppendVerticesAndIndicesForFilling in vector package, you can render complex shapes.

These APIs are added to vector package:

For actual usages, see examples/vector.

macOS's native fullscreen


On macOS, now fullscreening a window creates a new independent space and resizes the window to fit with the space.

Handling window-closing


You can prevent the window from being closed and do something when the window is being closed.

For actual usages, see examples/windowclosing.

New vsync mode for static applications


In addition to vsync on and vsync off, Ebiten v2.2 added a new mode: FPSModeVsyncOffMinimum. This indicates that the game doesn't sync with vsync, and the game is updated only when necessary like an input is detected. This is useful for a static application.

Append* functions

(#1692, #1705)

There are some Ebiten functions that return a new slice for each call. Creating a new slice for each call allocates memory and is not efficient. To mitigate this issue, new functions were added to accept a slice and append new elements. These work like the built-in function append. If the given slice has enough capacity, the functions don't allocate memory. If the given slice is empty or nil, a new slice is created.

Performance improvements

Other new functions



Issues for v2.2.1

Bug fix


Issues for v2.2.2

Bug fix


Issues for v2.2.3

Bug fix


Issues for v2.2.4

Bug fix


Issues for v2.2.5

Bug fix


Issues for v2.2.6

Bug fix


Issues for v2.2.7

Bug fix