Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ebitengine製iOSアプリ公開ボタンを押す会

Avatar for eiei114 eiei114
November 06, 2026

 Ebitengine製iOSアプリ公開ボタンを押す会

Avatar for eiei114

eiei114

November 06, 2026

More Decks by eiei114

Other Decks in Technology

Transcript

  1. 自己紹介 Roblox と Fortnite でゲームを作っていま す。 趣味の OSS では、Pi 向けの拡張を48個公

    開。累計 約14.5万ダウンロード。 Multica で、AI エージェントがチケットから PR まで回す「ソフトウェアファクトリー(笑)」づ くりに挑戦中。 Anthropic 公式ハッカソン「Built with Claude: Japan 2026」に参加中。
  2. ゲームの外へも持ち出したい ゲームの3Dモデル Tetra3D の生きもの → .glb で書き出す 形も色もゲームのまま → Blender

    などへ 並べる・動かす アニメや漫画も作ってみようかと画策中。 → アニメや漫画も? 作ってみたい
  3. 構成 iPhone アプリ Go のゲーム Objective-C・約120行 TidePool.xcframework 縦画面の枠 通知を出す 起動・止める・再開

    → ロジック ホームに戻ったら保存・停止 純粋な Go → 画面なしでテストできる ← 通知・共有をたのむ SNS 共有の画面を出す ebitenmobile bind 生える時刻と場所、回数、セーブ 描画・入力 岩と生きものを3Dで描く、なぞる操作 Ebitengine + Tetra3D でつなぐ 音 種ごとのはがす音、波の音 Ogg を Ebitengine で鳴らす iPhone 側は薄い枠。ゲームは全部 Go。
  4. 問題:72体並べてはがすと 2.3fps 生きもの 1体のメッシュ 72体 岩にびっしり × 4〜26個 メッシュ =

    3D の部品 メッシュ1個ごとに × 2回 1コマごとに = 数百回以上 深度の消去+コピー 全画面パス 全画面パス = 画面全体(約200万画素)ぶんの処理。 深度 = ピクセルごとの「カメラからの距離」。手前のものが奥を隠すために使う。 Tetra3D はメッシュ1個ごとに、この深度の画像(画面サイズ)を全部消して丸ごと写す。 1/60秒で描きたいのに、1コマごとに画面全体を何百回も処理していた。
  5. 外れ:部分再描画 部分再描画(dirty rect) はがす瞬間に重い → はがした所の四角だけ描き直す → 効果ゼロ 2.3〜17.9fps のまま。群れの描き直しは最大

    261ms 部分再描画の中でやっていたこと ① 四角の外の生きものを隠す びっしり並ぶと少ししか減らない → ② Tetra3D で描く メッシュごとに全画面パス。重い → ③ 四角の部分だけ写す 小さくなったのはここだけ 重い ② が減らなかった。重いのは Ebitengine ではなく、Tetra3D の深度の処理。 しかも、はがす瞬間には同期セーブ(1回 9.5ms)と GC の連発も重なっていた → 次のスライド
  6. 当たり:GC とベイク ① GC が回りっぱなし ② 群れをスプライトにベイク GC = 使い終わったメモリの自動掃除

    ベイク = 3D を1回だけ描いて、2D の画像にしておく Tetra3D が大きなバッファを持ち続けるので、膨らみすぎ 動かない生きものは1回だけレンダーしてスプライト(画像) 防止にメモリ上限 448MiB を自分で設定していた。ところ に。毎フレームは、奥から順に DrawImage で貼るだけ。 が生存ヒープ(まだ使っているメモリ)が 462MiB に増え て上限超え。掃除しても減らないのに GC が毎秒20回。 群れの描き直し:最大 18ms → 1ms 以下 debug.SetMemoryLimit で上限を 640MiB に → GC の連発が止まる ほかに、セーブの非同期化(書き込みを別の goroutine へ)で 9.5ms → 1ms 以下。