こんにちは、 Ebitengine 作者です。自作ゲームエンジンである Ebitengine およびそれを使ったゲームの開発経験に基づいて説明します。 Ebitengine は 2D ゲームエンジンであり、基本的に矩形画像しか取り扱いません。よってテクスチャはありますが 3D モデルはありません。

Ebitengine は自動テクスチャアトラスという機能があり、テクスチャパッキングを自動的に行います。 Ebitengine の矩形画像は ebiten.Image ですが、内部実装としては複数の ebiten.Image が 1 つの巨大なテクスチャアトラスを共有しています。テクスチャアトラスによって、 GPU から見ると殆どの場合描画元テクスチャが同じになり、描画命令をバッチングすることができます。これにより使用するレンダリングパイプラインの数を抑えることができます。ここらへんの手法について、詳しくは Ebitengine ぷち Conf 2 のスライド「How Ebitengine renders an image」などを参照してください。

Ebitengine が行うテクスチャパッキングは非常に単純な 2 分木アルゴリズムで、「領域を縦か横に分割して、空いているところに入れる」だけです。実装については internal/packing を参照してください。なにか問題があったら再実装しようと考えておりましたが、実際これで問題ないようです。なお、 Ebitengine のテクスチャパッキングが気に入らない場合は、ユーザーは自前でテクスチャパッキングをすることもできます (ebiten.NewImageOptions.Unmanaged)。しかしこれが必要になるケースは非常に稀だと思います。

テクスチャの解放については基本的に GC 任せです。 Ebitengine は Go のゲームエンジンなので GC を前提としています。一般的に GC がゲームのパフォーマンスにどう影響を与えるかについてはここでは論じません。ゲーム側としては、シーンごとなどに、不要になった画像 (ebiten.Image オブジェクト) の参照をなるべく削除することをおすすめしています。しかし、ゲームプログラム側でうっかり画像の参照を保持してしまい、もう使われないはずの画像が開放されずに残ってしまうという問題も稀にあります。本来はプログラムを修正して参照を削除するようにするべきですが、一時的な手段として、画像の内部リソースを明示的に開放する (*ebiten.Image).Deallocate というメソッドもあります。

以上、最良のプラクティスと言うよりは、「2D ゲームであれば現状これで動いている」という回答になりました。質問の直接的な回答になったかどうかはわかりませんが、ご参考になれば幸いです。

2024/04/17投稿
Loading...
匿名で 星一 さんにメッセージを送ろう

利用規約プライバシーポリシーに同意の上ご利用ください

Loading...