Ebiten 2.1 Release Notes

2.1.0

Issues for v2.1.0

New features

Functions

These functions were added (#770, #995, #1385, #1561):

See the new example examples/cursor for the cursors.

Functions (audio)

These functions were added (#1460):

Functions (text)

text.CacheGlyphs was added (#1413).

text.CacheGlyphs precaches the glyphs for the given text and the given font face into the cache.

The cache is shared with text.Draw. Glyphs are cached in a LRU way. As the cache's capacity has limit, it is not guaranteed that all the glyphs for runes given at CacheGlyphs are cached.

Draw automatically creates and caches necessary glyphs, so usually you don't have to call CacheGlyphs explicitly. However, for example, when you call Draw for each rune of one big text, Draw tries to create the glyph cache and render it for each rune. This is very inefficient because creating a glyph image and rendering it are different operations ((*ebiten.Image).ReplacePixels and (*ebiten.Image).DrawImage) and can never be merged as one draw call. CacheGlyphs creates necessary glyphs without rendering them so that these operations are likely merged into one draw call regardless of the size of the text. The two functions are implemented like this:

  • Draw = Create glyphs by (*ebiten.Image).ReplacePixels and put them into the cache if necessary + Draw them onto the destination by (*ebiten.Image).DrawImage
  • CacheGlyphs = Create glyphs by (*ebiten.Image).ReplacePixels and put them into the cache if necessary

Constants

For system cursors, a new type CursorShapeType and these constants were added (#995):

  • CursorShapeDefault
  • CursorShapeText
  • CursorShapeCrosshair
  • CursorShapePointer

These key constants were added (#1382, #1561):

  • KeyAltLeft
  • KeyAltRight
  • KeyControlLeft
  • KeyControlRight
  • KeyMeta
  • KeyMetaLeft
  • KeyMetaRight
  • KeyShiftLeft
  • KeyShiftRight

As the key name convention has changed, these key constants were added to replace some of the existing keys (#1394). The key constants to be replaced are kept for compatibility:

  • KeyArrowDown (replaces: KeyDown)
  • KeyArrowLeft (replaces: KeyLeft)
  • KeyArrowRight (replaces: KeyRight)
  • KeyArrowUp (replaces: KeyUp)
  • KeyBackquote (replaces: KeyGraveAccent)
  • KeyBracketLeft (replaces: KeyLeftBracket)
  • KeyBracketRight (replaces: KeyRightBracket)
  • KeyContextMenu (replaces: KeyMenu)
  • KeyDigit0 (replaces: Key0)
  • KeyDigit1 (replaces: Key1)
  • KeyDigit2 (replaces: Key2)
  • KeyDigit3 (replaces: Key3)
  • KeyDigit4 (replaces: Key4)
  • KeyDigit5 (replaces: Key5)
  • KeyDigit6 (replaces: Key6)
  • KeyDigit7 (replaces: Key7)
  • KeyDigit8 (replaces: Key8)
  • KeyDigit9 (replaces: Key9)
  • KeyNumpad* (replaces: KeyKP*)
  • KeyQuote (replaces: KeyApostrophe)

Build tag

A new build tag ebitensinglethread was added (#1367). If this is enabled, the number of the internal threads becomes one and you can expect performance improvement. As a side effect, all Ebiten's concurrent-safe functions become concurrent-unsafe.

Others

  • A tool to convert Go to C, go2cpp, was supported (#744). With this tool, Ebiten will work in an environment where Go is supposed not to work. Implmenting a binding for the targetted environment is necessary. We plan to announce the details later.
  • Rendering no longer stops when a user resizes the window (#1204).
  • A sub-image created by SubImage can now call Fill, DrawImage and so on as a receiver (#1255, #1461). With this, you can render an image with clipping.
  • CursorModeCaptured became available on some of browsers (#1572).
  • const became available in the shading language Kage (#1192).
  • A function cap was added to Kage (#1361).
  • A function imageDstOnTexture was added to Kage (#1428).
  • Audio for browsers was reimplemented (#1458). A buffer size became bigger and you can expect less noises.

Backward compatibility

  • "Negative mipmap" was abandoned (#1400). By this, rendering results of edges with a big scale might be different from those in v2.0. If you want to make sure edges are rendreed, you have to render a sub-image created by SubImage as a part of a big image.

Bug fix

This release includes all the bug fixes in v2.0.x.

Performance improvement

  • Reduced thread context switchings (#1358).
  • Made cache for the results of (*ColorM).Scale (#1474).
  • Fixed the problem that ReplacePixels might be slow in Metal (#1418, #1517).
  • Used DrawImage instead of ReplacePixels when extending an internal texture (#1022, #1414).
  • Used DrawImage instead of ReplacePixels when putting an idependent internal texture onto an internal texture atlas (#1508).
  • Reduced JavaScript object creations (#1426).
  • Reduced JavaScript string creations (#1437, #1438).
  • Used WebGL2 functions (#1435).
  • Reduced object creations when the package inpututil is used (#1473).

v2.1.1

Issues for v2.1.1

Bug fix

  • Audio didn't stop when the screen uncofused on browsers (Issue 1630).
  • Crashed when the audio length was exactly multiples of the internal buffer size on browsers (Issue 1635).

Ebiten 2.1 リリースノート

2.1.0

Issues for v2.1.0

新機能

関数

次の関数が追加されました (#770#995#1385#1561):

カーソルについては新しいサンプル examples/cursor を参照してください。

関数 (audio)

次の関数が追加されました (#1460):

関数 (text)

text.CacheGlyphs が追加されました (#1413)。

与えられた文字列とフォントから、グリフの事前キャッシュを作ります。

キャッシュは text.Draw と共有されます。グリフは LRU 方式でキャッシュされます。キャッシュ容量には上限があるので、 CacheGlyphs で与えられた文字のグリフすべてがキャッシュされる保証はありません。

Draw は自動的にグリフを作成しキャッシュするので、通常 CacheGlyphs を明示的に呼ぶ必要はありません。しかし、例えば、大きなテキストの 1 文字ずつに対して Draw を呼ぶ場合、 Draw はグリフを作って描画を作るということを 1 文字ずつに対して行います。これはとても非効率的です。なぜならばグリフの画像を作るのとそれを描画するのは異なる操作で ((*ebiten.Image).ReplacePixels(*ebiten.Image).DrawImage)、 1 つのドローコールとしてマージされないからです。 CacheGlyphs は必要なグリフを描画せずに作るので、文字列の大きさに関わりなく、高確率で操作がマージされて 1 つのドローコールになります。 2 つの関数は次のように実装されています:

  • Draw = 必要ならばグリフを (*ebiten.Image).ReplacePixels で作り、それらをキャッシュする + (*ebiten.Image).DrawImage で描画先上に描画する
  • CacheGlyphs = 必要ならばグリフを (*ebiten.Image).ReplacePixels で作り、それらをキャッシュする

定数

システムカーソルのために、型 CursorShapeType 及び次の定数が追加されました (#995):

  • CursorShapeDefault
  • CursorShapeText
  • CursorShapeCrosshair
  • CursorShapePointer

次のキー定数が追加されました (#1382#1561):

  • KeyAltLeft
  • KeyAltRight
  • KeyControlLeft
  • KeyControlRight
  • KeyMeta
  • KeyMetaLeft
  • KeyMetaRight
  • KeyShiftLeft
  • KeyShiftRight

キー定数の命名規則変更に伴い、次のキー定数が既存キーの置き換えとして追加されました (#1394)。置き換わり元のキー定数は互換性のために残しています:

  • KeyArrowDown (元: KeyDown)
  • KeyArrowLeft (元: KeyLeft)
  • KeyArrowRight (元: KeyRight)
  • KeyArrowUp (元: KeyUp)
  • KeyBackquote (元: KeyGraveAccent)
  • KeyBracketLeft (元: KeyLeftBracket)
  • KeyBracketRight (元: KeyRightBracket)
  • KeyContextMenu (元: KeyMenu)
  • KeyDigit0 (元: Key0)
  • KeyDigit1 (元: Key1)
  • KeyDigit2 (元: Key2)
  • KeyDigit3 (元: Key3)
  • KeyDigit4 (元: Key4)
  • KeyDigit5 (元: Key5)
  • KeyDigit6 (元: Key6)
  • KeyDigit7 (元: Key7)
  • KeyDigit8 (元: Key8)
  • KeyDigit9 (元: Key9)
  • KeyNumpad* (元: KeyKP*)
  • KeyQuote (元: KeyApostrophe)

ビルドタグ

新しいビルドタグ ebitensinglethread が追加されました (#1367)。有効にすると、内部のスレッドが 1 つになり、パフォーマンスの向上が期待されます。副作用として、すべてのコンカレントセーフな Ebiten の関数が、コンカレントセーフでなくなります。

その他

  • Go を C++ に変換するツールである、 go2cpp に対応しました (#744)。これにより、 Go が本来コンパイルできない環境でも Ebiten を動かす事ができるようになります。環境に合わせてバインディングの実装が必要です。詳細については、今後発表していく予定です。
  • ウィンドウを拡大縮小しても、描画が止まらなくなりました (#1204)。
  • SubImage で作られた部分画像に対して FillDrawImage などが呼べるようになりました (#1255#1461)。これにより、クリッピングを使った描画ができるようになりました。
  • CursorModeCaptured が一部ブラウザでも動くようになりました (#1572)。
  • シェーディング言語 Kageconst が使えるようになりました (#1192)。
  • シェーディング言語 Kage に cap 関数が追加されました (#1361)。
  • シェーディング言語 Kage に imageDstOnTexture 関数が追加されました (#1428)。
  • ブラウザにおけるオーディオを再実装しました (#1458)。オーディオバッファに余裕ができ、ノイズが減ることが期待されます。

後方互換性

  • 「負のミップマップ」が廃止されました (#1400)。これにより、大きな拡大率ので描画した倍、端の描画の結果が v2.0 と比べて変わることがあります。端を含めて確実に描画したい場合は、描画元画像に SubImage を用いて、大きな画像の一部として描画してください。

バグ修正

このリリースには、 v2.0.x にあるすべてのバグ修正が含まれます。

  • TPS の値が極端に小さい場合にうまく動かなかった問題の修正 (#1417)
  • TPS の値が極端に大きい場合にうまく動かなかった問題の修正 (#1443#1444)
  • CursorPosition が極端に小さい値を返すことがあった問題を修正 (#1587)。
  • GamepadName および GamepadSDLID がブラウザで間違った値を返す可能性があった問題の修正 (#1472)。
  • SetWindowIcon*ebiten.Image を与えるとクラッシュした問題の修正 (#1468)。
  • フルスクリーン時に SetWindowIcon を呼ぶとアイコンが消えてしまう問題の修正 (#1587)。
  • NewInfiniteLoop および NewInfiniteLoopWithIntro に 4 の倍数でない長さのバッファを与えたときにうまく動かなかった問題の修正 (#1503)。
  • シェーディング言語 Kage で dfdxdfdyfwidth関数がブラウザで動かなかった問題の修正 (#1404)。
  • シェーディング言語 Kage で同名の関数が重複してもエラーにならなかった問題の修正 (#1430)。

パフォーマンス改善

  • スレッドのコンテキストスイッチの削減 (#1358)。
  • (*ColorM).Scale の結果をキャッシュするように修正 (#1474)。
  • Metal において ReplacePixels が遅くなることがあった問題の改善 (#1418#1517)。
  • 内部テクスチャアトラス拡大時に ReplacePixels ではなく DrawImage を使用するように変更 (#1022#1414)。
  • 独立内部テクスチャを内部テクスチャアトラス上に乗せるときに ReplacePixels ではなく DrawImage を使用するように変更 (#1508)。
  • JavaScript オブジェクト生成を削減 (#1426)。
  • JavaScript 文字列生成を削減 (#1437#1438)。
  • WebGL2 関数の使用 (#1435)
  • inpututil パッケージ使用時のオブジェクト生成を削減 (#1473)。

v2.1.1

Issues for v2.1.1

Bug fix

  • ブラウザで、画面のフォーカスが外れてもオーディオが止まらなかった問題の修正 (Issue 1630)。
  • ブラウザで、オーディオの長さが正確に内部バッファサイズの倍数だったときにクラッシュした問題の修正 (Issue 1635)。