ClaudeでUnityのProfilerキャプチャを読む — GC Allocとドローコールの絞り込み
UnityのProfilerをスクリーンショットでClaudeに渡し、GC Allocとドローコールの原因を絞る手順です。画像の限界と、推測を実測で確かめる検証も扱います。
UnityのProfilerはスクリーンショットをClaudeに渡せば、GC Allocが大きいサンプルやドローコールが多い場面の候補を挙げてもらえます。ただし画像から読めるのは「どこが怪しいか」までです。原因の確定は、コードを直したあとにProfilerの数値が下がるかどうかで決まります。
この記事は、重いフレームを1枚選ぶところから、画像の切り方、聞き方、検証までを順に追います。
Profilerのどの画面を渡すか
画面全体を撮って渡すより、見たい表だけを切り抜くほうが読み違いが減ります。大きな画像は縮小され、細かい数字が読み取りにくくなるためです(詳しくは後半で触れます)。
CPUの原因を探すなら、CPU Usageモジュールの詳細ペインを使います。表示はTimelineとHierarchyなどから選べ、用途が違います。
| 表示 | 向いている問い | 備考 |
|---|---|---|
| Hierarchy | 向いている問いどの処理が時間とGC Allocを食っているか | 備考呼び出し回数順・メモリ割り当て順にも並べ替えられる |
| Inverted Hierarchy | 向いている問い小さな処理が大量に積み上がっていないか | 備考Timelineや通常のHierarchyでは見つけにくい |
| Timeline | 向いている問いスレッド間で待ちが発生していないか | 備考全スレッドを時間軸で見られる唯一の表示 |
Hierarchyの列はTotal、Self、Calls、GC Alloc、Time ms、Self ms、Warningです。GC Allocの原因探しではGC Alloc列で降順に並べ、上位数行が写るように切り抜きます。
GC Allocの原因を絞る
渡す画像と一緒に書く情報
Claudeには画像のほかに、キャプチャの条件を文章で添えます。画像からは読み取れない前提を補うためです。
添付はUnity 6のProfiler(CPU Usage > Hierarchy)で、GC Alloc列の降順に並べたものです。
実機のDevelopment Buildで、戦闘シーンの重いフレームを1つ選んでいます。
- 1フレームあたりのGC Allocが多いサンプルの上位を挙げてください
- 各サンプルについて、表のどの列を根拠にしたかを書いてください
- 原因の候補は「画像から言えること」と「コードを見ないと分からないこと」を分けてください画像はテキストより前に置くと最もよく働くので、添付を先に、条件と指示の文章をあとに並べます。
最後の指示が肝です。画像からは「この処理が割り当てている」までしか言えません。なぜ割り当てているかはコードを読む段階の話です。分けて答えさせると、推測と観察が混ざりにくくなります。
候補が挙がったら、コードに戻す
サンプル名がPlayerMover.Updateのように自分のスクリプトを指していれば、そこから先はClaude Codeの得意分野です。該当ファイルを開かせ、毎フレーム走る箇所の割り当てを洗い出させます。
Profilerで GC Alloc が最大だったのは EnemySpawner.Update でした。
このファイルを読み、毎フレーム実行されるパスで新しい参照型を作っている箇所を列挙してください。
修正はまだしないでください。ガベージコレクタの起動が多いと性能の問題になります。対策には、UnityEngine.PoolのAPIでよく使うオブジェクトを再利用する方法があります。プーリングで直す前に、本当にそのサンプルが原因かをProfilerで確かめる順番にします。
ドローコールの原因を絞る
CPU側の描画コストは、CPU UsageではなくRenderingモジュールで見ます。チャートにはBatches、SetPass Calls、Triangles、Verticesが出ます。下ペインにはDraw Callsや、動的バッチ・静的バッチ・インスタンシングごとの数値が並びます。
渡す画像は、Renderingモジュールの下ペインを丸ごと1枚にします。聞き方の例です。
添付はRenderingモジュールの詳細ペインです。
SetPass Calls と Batches のどちらが目立って多いかを、数値を引用して答えてください。
動的バッチ・静的バッチ・インスタンシングの「Batched Draw Calls」が0のものがあれば挙げてください。数値の読み上げはClaudeに任せられますが、「ドローコールを減らすには何を直すか」は画像だけでは決まりません。どのGameObjectが描画に寄与しているかは、Frame Debuggerで1ドローコールずつ確認できます。Renderingモジュールの詳細ペインにあるOpen Frame Debuggerから開けるので、そのキャプチャも続けて渡すと切り分けが進みます。
統計のうちBatched Draw CallsやUsed Texturesなどは、リリースビルドのPlayerでは取得できません。取得できるのはSetPass Calls、Draw Calls、Batches、Triangles、Verticesと、レンダーテクスチャやバッファ関係の一部です。リリースビルドでの再現を確かめたいときは、取得可能な項目に絞って比べます。
推測を実測で確かめる
Claudeが挙げた原因は仮説です。直す前後で同じ条件のキャプチャを撮り、数値で比べます。画像比較に頼らず、ProfilerRecorderで数値を直接取る方法もあります。
Unity公式マニュアルのRenderingモジュールのページには、SetPass Calls Count、Draw Calls Count、Vertices Countを取得して画面に表示するスクリプトの例があります。次はその形を踏まえた例です。数値をログに出す形にしてあります。
using Unity.Profiling;
using UnityEngine;
public class RenderStatsLogger : MonoBehaviour
{
ProfilerRecorder setPass;
ProfilerRecorder drawCalls;
void OnEnable()
{
setPass = ProfilerRecorder.StartNew(
ProfilerCategory.Render, "SetPass Calls Count");
drawCalls = ProfilerRecorder.StartNew(
ProfilerCategory.Render, "Draw Calls Count");
}
void OnDisable()
{
setPass.Dispose();
drawCalls.Dispose();
}
void Update()
{
if (setPass.Valid && drawCalls.Valid)
Debug.Log($"SetPass={setPass.LastValue} DrawCalls={drawCalls.LastValue}");
}
}Claudeには修正前後のログ2本を貼り、差分を表にするよう頼めば足ります。
検証の型は次の4手順です。
仮説を実測で確かめる流れ
- 1
基準を撮る
重いフレームを選び、同じ条件で再現できる状態にして、Hierarchyの切り抜きとRenderingの数値を保存します。
- 2
仮説を1つに絞る
Claudeの候補から1件だけ選びます。複数を同時に直すと、どれが効いたか分かりません。
- 3
直して同じ条件で撮り直す
同じシーン・同じカメラ位置・同じビルド設定で、基準と同じ画面を撮ります。
- 4
数値で判断する
GC Alloc列やSetPass Callsが下がったかを見ます。下がらなければ、その仮説は外れです。
画像が読めなかったときの対処
Profilerは小さな文字と細い行で構成されるため、縮小の影響を受けやすい画面です。Claudeの画像処理には次の制約があります。
- 標準の解像度帯のモデルでは、長辺1,568px・視覚トークン1,568個を超える画像が縮小される
- Claude 4.7以降のモデルは高解像度帯で、長辺2,576px・視覚トークン4,784個まで縮小されない
- 1920×1080の画像は、標準帯で1,560トークン、高解像度帯で2,691トークン
- 200px未満の小さな画像や回転した画像では、読み違いが起きやすい
- 1リクエストで画像が20枚を超えると、1枚あたりの寸法制限が厳しくなる。長辺2,000px以下に抑えれば安全
Hierarchyの表を4K画面で撮った全体画像として渡すと、縮小で数字が潰れます。3840×2160の画像は、標準帯では1456×819pxに縮められて1,560トークン、高解像度帯でも2576×1449pxに縮められて4,784トークンです。1行の高さが数pxになった表は、読み取りの精度が落ちます。表の範囲だけを切り抜き、行数が多ければ上位10行前後ずつに分けて撮るのが確実です。
同じ表の数字を、読めた範囲で書き起こしてください。読めない行は「不明」と書いてください。この指示で書き起こさせれば、読み違いを事前に見つけられます。画像から数値を読むときは、書き起こしと元の画面を一度突き合わせます。Claudeの数値の読み取りは近似になることがあるためです。
画像のメタデータはClaudeに渡らないので、キャプチャ時のビルド設定やUnityのバージョンは文章で添えます。
テキストで渡したいとき
Timelineの個々のサンプルは、ツールチップのテキストを選択してコピーすると、コールスタックを含む内容をクリップボードに取れます。HierarchyのSelected Sample Stackも、別ウィンドウに開いてコピーできます。数十行の表なら画像よりテキストのほうが読み違いが起きないので、怪しい1サンプルを深掘りする場面ではテキストを貼ります。
Claude Codeに画像を渡す
対応する形式はJPEG、PNG、GIF、WebPです。GIFなどのアニメーションは先頭フレームだけが使われます。Claude Codeでは、画像をウィンドウにドラッグ&ドロップするか、Ctrl+Vで貼り付けるか、画像のパスを書いて渡せます。WindowsとWSLでは貼り付けにAlt+Vを使います。
パスで渡す場合は、Readの拒否ルールに注意します。パスが拒否ルールに一致すると、画像は添付されません。キャプチャ置き場をdenyにしている構成では、Profiler用のフォルダだけ除外します。
C#の編集や検証ループとの組み合わせはClaude CodeでUnityゲーム開発を進める手順にまとめています。Editor上の操作まで任せたい場合はUnity MCPをClaude Codeで使う方法が選択肢になります。
よくあるつまずき
落とし穴
Editorで撮ったキャプチャを実機の結果として扱う
EditorのPlay modeには、エディタ固有の処理が含まれます。Claudeが挙げた原因がエディタ固有のものでないかを、実機のDevelopment Buildで撮り直して確かめます。
もう1つは、フレームの選び方です。
落とし穴
1枚のキャプチャで結論を出す
重いフレームは1つの瞬間です。連続して重いのか、一瞬だけ重いのかは、チャートで複数フレームを見ないと分かりません。Claudeに渡す前に、選んだフレームが代表的かを確認します。
アプリ側とデータベース側のように原因が複数の層に分かれる場合の切り分けは、Claudeで負荷試験の結果を分析する手順と同じ考え方が使えます。層を1つずつ疑い、数値で潰していきます。
まとめ
Profilerの画像は、怪しい箇所を絞る入り口としてClaudeに渡せます。切り抜きは見たい表だけに絞り、キャプチャ条件を文章で添え、画像から言えることとコードを見ないと言えないことを分けて答えさせます。直したあとは、同じ条件で撮り直した数値が下がったかどうかだけを判断材料にします。
参照した一次ソース
この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。