AIゲーム制作ラボ

Unityの光をスプライトとメッシュで比較:Webで逆転した更新時間

光をつなぐパズル「灯路」で、線分スプライトと接続メッシュを実装して比較しました。Rendererは85個から2個になっても描画命令は56回から55回。Webで更新時間が増えた理由と、それでも採用した判断を実測と画面で残します。

Libra

公開 2026年9月20日 ・ 更新 2026年9月21日

この記事の要点3項目

Rendererの個数と描画命令数は別だった。 85個から2個にしても、画面全体のdraw呼び出しは56回から55回

残り2つの要点を読む
  • Webではメッシュの更新処理が遅かった。 PCの中央値は線分0.030ms、メッシュ0.125ms
  • 採用した理由は、光の接続部分の明るさを揃えること。 fpsの向上は観測していない。
目次6
検証した環境最終確認 2026年9月20日
  • Unity 6000.6.0f1 / WebGL / Codex制作
  • Windows / Core i9-10900K / GeForce RTX 2080 Ti
  • 表示ありChrome / PC 1280×800・DPR1 / スマホ幅375×812・DPR2

書いてあるのは、この環境で実際に試した結果です。ツールの仕様や料金は変わるので、重要な判断の前には公式の情報も確認してください。

鏡を回して灯台へ光を届けるパズル「灯路」をCodexで作りました。描画方式を変える効果を確かめるため、線分スプライトと接続メッシュを同じ盤面で比べました。

結果は単純ではありませんでした。メッシュはWebでの更新処理が遅くなりました。 それでも採用したのは、曲がり角や交差の明るさを揃えられたからです。

85 → 2

光のRenderer数

画面全体のdraw数とは別

56 → 55

画面全体のdraw呼び出し

表示中のChromeで測定

16.7ms

両方式のフレーム中央値

fps向上は確認していない

計測対象は初公開版v1です

この記事の29辺・518配置・描画時間は、初公開版の盤面で測った結果です。公開ゲームのv1.1では難易度の指摘を受けて4〜12面を作り直しました。現在の盤面の数値としては扱いません。改良理由と検査結果も公開しています。

線分ごとの加算描画では、接続部分が明るくなる

最初は光路をセル間の辺に分け、各辺へ太い光と細い芯を置きました。セルの中心には小さな光点を足しています。加算合成なので、重なる場所は明るくなります。

実装は扱いやすかったものの、同じ光なのに、つなぎ目だけ粒のように目立つ状態でした。

線分スプライトで描いた灯路の最終面。光の経路に沿ってセル中心の光点が並ぶ
旧方式。太い光、細い芯、接続部分の光点を別々に描いている。

セル中心を1回だけ描くメッシュを作った

新しい方式では、セル中心の小さな四角を1回だけ描きます。隣のセルへ伸びる長方形は、その四角の境界で止めました。辺と中心の面積が重ならないため、交差にも同じ考え方を使えます。

  1. 1

    経路の辺を重複排除する

    同じ2セルをつなぐ辺は、往復しても1本として扱う。
  2. 2

    中心と辺の領域を分ける

    辺の両端を半幅ずつ短くし、使用するセルの中心に四角を1つ置く。
  3. 3

    太い光と細い芯を別のメッシュにする

    2層の幅・色・透明度を線分方式と揃えて比較する。

終端には半幅ぶんの四角いキャップが付き、旧方式の光点はなくなります。単に同じ絵を少ないオブジェクトで描いた変更ではありません。 接続部分の絵も変えています。

接続メッシュで描いた灯路の最終面。曲がり角と交差を含め、金色の光が均一につながる
採用した接続メッシュ。旧方式と同じ29辺のクリア配置で撮影した。

Editorで短くなった更新時間が、Webでは増えた

最終面の同じ配置を、同じカメラと解像度で比較しました。Webでは線分→メッシュ→メッシュ→線分→線分→メッシュの順に実行。各回、新しいブラウザプロファイルで起動し、HTTPキャッシュも無効にしています。

計測対象線分スプライト接続メッシュ
Editor・更新中央値0.053625ms0.040765ms
Web・PCの更新中央値0.030ms0.125ms
Web・スマホ幅の更新中央値0.030ms0.120ms
Web・画面全体のdraw呼び出し56回55回
Web・フレーム中央値16.7ms16.7ms

更新処理は30回ウォームアップ後、20回の平均を50組記録しました。Editorは各方式1試行、Webは各3試行の中央値です。Webの描画は表示中の6秒間を計測し、全試行のフレームP95は16.8msでした。

測った範囲

更新時間はCPU側のRefresh処理で、GPUの完了時間ではありません。フレーム間隔は描画呼び出しがあったrAFの間隔です。スマホ幅も同じ開発PC上の結果で、スマホ実機の性能ではありません。

Renderer数だけを見ると大きく減っています。しかし、実際のdraw呼び出しは1回減っただけでした。Webで更新時間が増えた内訳までは切り分けていないため、メッシュの転送だけが原因だとは断定できません。

比較が成立するまでに、3か所直した

01

最終面を測るつもりで第1面を測っていた

症状
最初の計測結果は6辺しかなかった。
原因
計測用セーブを「12面解放・すべて未クリア」にしたため、整合性検査で初期状態へ戻っていた。
対処
解放条件を満たす記録に直し、測定スクリプトでも辺数が29であることを検査した。6辺の結果は比較に使っていない。
02

同じ色を指定してもメッシュだけ淡くなった

症状
最初の比較画像で、メッシュの光が旧方式より淡く見えた。
原因
線形色空間でSpriteRendererの色とメッシュ頂点色の変換を揃えていなかった。
対処
メッシュ用の色を生成時に線形へ変換し、同じ盤面の画像を撮り直した。
03

光路計算のP95まで0msになった

症状
Webで1回ずつ測ると、短い処理が0msになった。
原因
処理時間が計時の分解能に届かなかった。
対処
全518配置をそれぞれ100回ずつ計算し、配置ごとの1回平均を記録した。合計51,800回。平均値の分布であることを明記した。

接続の見た目を優先し、操作時の小さな負荷を受け入れた

接続メッシュのWeb更新時間は、バッチ平均のP95でも最大0.325msでした。この処理は鏡の操作時にだけ走ります。待機中は光路を再計算せず、1,000回の回転とUndoに対して評価も1,000回であることを確認しています。

今回は「速くなったから」ではなく、光が均一につながる見た目を理由に採用した。

検査では上下左右の接続15通りについて、辺の隙間と面積の重なりを確認しました。ゲーム全体のUnityテストは74件。PCとスマホ幅で、通常設定と音なし・動き少なめの設定の全12面を通しています。

同じ変更でも、Editorの数字だけでWebの結果を予想できませんでした。今後もRenderer数、実際の描画命令、更新時間、画面の見た目を分けて判断するための比較として、この記録を残します。

光路計算から試したい場合は、反射・分岐・循環の作り方とC#サンプルへ進めます。

よくある質問

よくある質問

SpriteRendererをMeshに置き換えると速くなりますか?

このゲームでは一律に速くなりませんでした。Editorでは更新時間が短くなりましたが、Webでは増えました。どちらもフレーム間隔は中央値16.7msで、fps改善は確認していません。

Rendererを85個から2個にすると描画命令も同じ割合で減りますか?

今回の画面全体では56回から55回でした。Rendererの個数からdraw呼び出し数を推定せず、実際のブラウザで計測する必要がありました。

スマホでも60fpsで動きますか?

確認したのは開発PC上のスマホ幅とタッチ操作です。スマホ実機のGPUや発熱、通信環境での性能は未確認です。

0msと出た処理時間はどう扱いましたか?

計測の分解能に届かなかったため、光路計算を同じ配置で100回実行し、合計を100で割りました。単発処理のP95ではなく、配置ごとの平均時間のP95として区別しています。

この記事は役に立ちましたか?

関連記事