Ebiten 2.2 Release Notes

v2.2.0

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

(#1549)

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

Standard gamepad layout mappings

(#1557)

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:

  • Two sticks
  • Four buttons on the left hand (usually for arrows or D-pad)
  • Four buttons on the right hand
  • Four buttons on the front
  • Three buttons on the center

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

(#1684)

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

(#1506)

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

Handling window-closing

(#1574)

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

(#1556)

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

  • Memory usage at ReplacePixels was improved (#1681).
  • Allocating color matrices for scaling was improved (#1658).
  • Reduced allocations of color matrix values (#1796).
  • Ensured to free memory for image pixels soon after they were no longer used (#1803).

Other new functions

Others

  • A constant ebiten.SyncWithFPS was added to replace ebiten.UncappedTPS (#1726).
  • In audio/mp3, audio/vorbis, audio/wav packages, Decode and DecodeWithSampleRate now takes io.Reader instead of io.ReadSeeker (#1621).
  • Fixed an issue that dfdx and some functions in non-main function failed to compile in Kage (#1701).
  • Fixed the device scale factor on Linux and Unix desktops (Thank you, divVerent!) (#1774).

v2.2.1

Issues for v2.1.1

Bug fix

  • The screen was scaled wrongly with multiple and various scaling monitors on Windows (#1844).
  • The screen was sometimes too small on Linux KDE (#1847).

Ebiten 2.2 リリースノート

v2.2.0

Issues for v2.2.0

Nintendo Switch™

Nintendo Switch をサポートしました。詳しくは任天堂プラットフォーム開発者向けポータルサイト Nintendo Developer Portal をご覧ください。

オーディオ再実装

(#1549)

各プレイヤーが大きいバッファを持つように、オーディオの実装が改善されました。遅延やノイズが低減するはずです。

標準ゲームパッドマッピング

(#1557)

Ebiten v2.1 までは、 Ebiten のゲームパッドボタンや軸の割当は、ゲームパッドごと、または環境ごとに異なりました。たとえば、ゲームパッドボタン 1 は他の環境では違う物理ボタンを指すかもしれません。ゲームパッドを使うと、ポータビリティを維持するのが大変でした。

Ebiten v2.2 は Web 標準の標準ゲームパッドレイアウトを採用しました。標準ゲームパッドレイアウトは、 Xbox、 PlayStation、 Nintendo Switch といったモダンなゲームパッドのモデルです。標準ゲームパッドレイアウトは次のボタンや軸を仮定します:

  • 2 つのスティック
  • 4 つの左側のボタン (通常、方向キーや十字キー向け)
  • 4 つの右側のボタン
  • 4 つの前方のボタン
  • 3 つの真ん中のボタン

標準ゲームパッドレイアウト

標準ゲームパッドレイアウト

もし使っているゲームパッドおよび環境で、標準ゲームパッドレイアウトが利用可能ならば、 StandardGamepadButton のような標準ゲームパッド API が使えます。ボタンや軸の割当の違いを気にする必要がなくなります。

デスクトップでは SDL のゲームパッドデータベースが使われます。ブラウザでは、ブラウザの標準マッピングが使われます。モバイルでは、マッピングはまだ利用できません。

残念ながら、すべてのゲームパッドが標準ゲームパッドレイアウトに対応しているとは限りません。サポートされてないゲームパッドに対しては、既存の API を使ってください。

実際の使用例については、 examples/gamepad を参照してください。

ベクターグラフィック

(#1684)

examples/vector のスクリーンショット

examples/vector のスクリーンショット

Ebiten のベクターグラフィックス API は再設計され、ステンシルバッファを使うよう再実装されました。

ebiten.DrawTrianglesOptions のメンバとして FillMode が追加されました。フィルモードが ebiten.EvenOdd は、重なった領域がどう描画されるかについてのルールで、 vector パッケージの新関数 AppendVerticesAndIndicesForFilling と組み合わせることで複雑な図形を描画できます。

vector パッケージに次のような関数が追加されました:

実際の使用例については、 examples/vector を参照してください。

macOS のネイティブフルスクリーン

(#1506)

macOS では、ウィンドウをフルスクリーンにするときに、新しい独立したスペースを作りそこにウィンドウをフィットさせる挙動になりました。

ウィンドウが閉じられるときのハンドリング

(#1574)

ウィンドウが閉じられるのを止めたり、ウィンドウが閉じられようとするタイミングで何かを行うことができるようになりました。

実際の使用例については、 examples/windowclosing を参照してください。

静的なアプリケーションのための新しい vsync モード

(#1556)

Vsync のオン・オフに加えて、 Ebiten v2.2 では新しい vsync モード FPSModeVsyncOffMinimum が利用できます。これはゲームは vsync には同期せず、入力が検知されたなど必要なタイミングのみで更新を行うモードです。静的なアプリケーションを実装するのに便利です。

Append* 関数

(#1692, #1705)

Ebiten のいくつかの関数は、呼び出しごとに新しいスライスを作っていました。関数呼び出しごとに新しいスライスを作るのは、メモリをアロケートするので非効率です。この問題を低減するため、スライスを受け取り新しい要素をそこに追加するような新しい関数が追加されました。これらは組み込み関数 append のような動作をします。もしスライスに十分なキャパシティがあれば、その関数は新しいメモリをアロケートすることはありません。もし空スライスや nil が渡ってきたのなら、新しいスライスが作成されます。

パフォーマンス改善

  • ReplacePixels のメモリ使用量が改善されました (#1681)。
  • スケールのための色行列アロケーションが改善されました (#1658)。
  • 色行列のアロケーションが減りました (#1796)。
  • もう使われないピクセルデータについて、確実にメモリを解放するようにしました (#1803)。

その他の新しい関数

その他

  • 定数 ebiten.SyncWithFPS が追加されました。 ebiten.UncappedTPS の置き換えです (#1726)。
  • audio/mp3, audio/vorbis, audio/wav パッケージで、 Decode 関数と DecodeWithSampleRate 関数が io.ReadSeeker の代わりに io.Reader を取るようになりました (#1621)。
  • Kage で、 dfdx やいくつかの関数が main ではない関数で使われているときにコンパイルできない問題を修正しました (#1701)。
  • Linux および Unix のデバイススケールファクター値を修正しました (ありがとう、 divVerent さん!) (#1774).

v2.2.1

Issues for v2.1.1

バグ修正

  • Windows で、複数のスケールの異なるマルチモニタを使用したときに、画面のスケールが間違っていた問題の修正 (#1844)。
  • Linux KDE で、画面が時々小さくなってしまっていた問題の修正 (#1847)。