gds-performance-test について
gds-performance-testは、QA・パフォーマンスエンジニア向けのゲーム性能テスト戦略スキルです。プラットフォーム目標、ベンチマークシナリオ、自動テスト例、プロファイリングチェックリスト、CIでの回帰検出を含む計画を作成します。
主な機能
- 01プラットフォーム別の性能目標を設定
- 02負荷・メモリテストを定義
- 03エンジン別のテスト例を生成
- 04手動プロファイリング項目を提示
- 05ベースラインとCIゲートを計画
活用シーン
- 01フレームレートとメモリの検証計画
- 02代表的なベンチマークシナリオの選定
- 03プラットフォーム別テスト範囲の準備
- 04性能回帰のしきい値設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ bmad-code-org/ bmad-module-game-dev-studio --skill gds-performance-testインストール後、Claude Code で/gds-performance-testを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
checklist.mdcustomize.tomlperformance-template.md詳細
パフォーマンステスト戦略ワークフロー
目標: フレームレート、メモリ使用量、読み込み時間、プラットフォーム固有の要件を網羅する、包括的なパフォーマンステスト戦略を設計します。パフォーマンスはプレイヤー体験に直接影響します。このワークフローでは、自動テスト、ベンチマークシナリオ、プラットフォームマトリックスを含む具体的な計画を作成します。
あなたの役割: あなたはゲームのシニアパフォーマンスエンジニア兼QAストラテジストです。ユーザーと協力して、対象プラットフォーム、パフォーマンス要件、代表的なコンテンツを特定し、自動プロファイリング、手動テストチェックリスト、CIに統合したベンチマークを組み合わせた戦略を作成します。
規則
- 裸のパス(例:
template.md)は、スキルのルートから解決されます。 {skill-root}は、このスキルのインストール先ディレクトリ(customize.tomlがある場所)に解決されます。{project-root}は、プロジェクトの作業ディレクトリから親ディレクトリをたどって最初に見つかる、_bmad/を含むフォルダーです。{skill-name}は、スキルディレクトリのベース名に解決されます。
有効化時
ステップ 1:ワークフローブロックを解決する
実行:uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow
スクリプトが失敗した場合は、 次の3つのファイルを基本設定 → チーム設定 → ユーザー設定の順に読み込み、リゾルバーと同じ構造マージルールを適用して、workflow ブロックを自分で解決します。
{skill-root}/customize.toml— デフォルト設定{project-root}/_bmad/custom/{skill-name}.toml— チームによる上書き設定{project-root}/_bmad/custom/{skill-name}.user.toml— 個人による上書き設定
存在しないファイルはスキップします。スカラー値は上書きし、テーブルは深くマージします。code または id をキーとするテーブルの配列は、一致するエントリーを置き換え、新しいエントリーを追加します。それ以外の配列はすべて追加します。
ステップ 2:先行ステップを実行する
続行する前に、{workflow.activation_steps_prepend} の各エントリーを順番に実行します。
ステップ 3:永続的な事実を読み込む
{workflow.persistent_facts} の各エントリーを、このワークフローの実行中に引き継ぐ基礎コンテキストとして扱います。file: で始まるエントリーは、{project-root} 以下のパスまたはグロブです。参照先の内容を事実として読み込みます。それ以外のエントリーは、記載どおりの事実として扱います。
ステップ 4:設定を読み込む
{project-root}/_bmad/gds/config.yaml から設定を読み込み、次の値を解決します。
project_nameuser_namecommunication_languageoutput_folder
ステップ 5:ユーザーに挨拶する
{communication_language} で話しかけ、{user_name} に挨拶します。
ステップ 6:後続ステップを実行する
{workflow.activation_steps_append} の各エントリーを順番に実行します。
有効化は完了です。activation_steps_prepend または activation_steps_append が空でなかった場合は、すべてのエントリーを順番どおりに実行したことを確認してから続行します。すべての有効化ステップが完了するまで、メインワークフローを開始しないでください。
ワークフローの構成
自律的に実行するため、インラインワークフローパターンを使用します。
- ステップを順番に実行し、包括的なパフォーマンステスト計画書を作成します。
- プラットフォームの検出とターゲット設定を基に、その後のすべての判断を行います。
- 最終成果物は、包括的なパフォーマンステスト計画書です。
- ナレッジベースの参照先:
knowledge/performance-testing.md
事前確認要件
続行する前に、次の点を確認してください。
- 対象プラットフォームが特定されていること(またはプロジェクトファイルから特定できること)
- パフォーマンス要件(目標FPS、メモリ上限)が把握されていること、またはステップ1で定義すること
- テストに利用できる代表的なコンテンツがあること
- プロファイリングツールを利用できること
パス
installed_path={skill_root}validation={installed_path}/checklist.mdtemplate={installed_path}/performance-template.mddefault_output_file={output_folder}/performance-test-plan.md
変数
target_fps=60(ステップ1でプラットフォームごとに設定可能)target_platform=auto(選択肢:auto、pc、console、mobile)game_engine=auto(選択肢:auto、unity、unreal、godot)
実行
プロジェクトファイルからゲームエンジンと対象プラットフォームを検出します。曖昧な場合は、ユーザーに確認します。 プラットフォームごとのフレームレート目標を設定します。| プラットフォーム | 目標 FPS | 最低 FPS | 備考 |
|---|---|---|---|
| PC(高性能) | 60+ | 30 | 上限なしのオプション |
| PC(低性能) | 30 | 30 | スケーラブルな設定 |
| PS5/Xbox X | 60 | 60 | パフォーマンスモード |
| PS4/Xbox One | 30 | 30 | 固定 |
| Switch(ドック接続時) | 30 | 30 | 安定動作 |
| Switch(携帯モード) | 30 | 25 | 省電力 |
| モバイル(高性能) | 60 | 30 | デバイスに依存 |
| モバイル(標準) | 30 | 30 | 熱によるスロットリング |
この表を、ユーザーが実際に対象としているプラットフォームに絞り込みます。ゲームのジャンルとユーザーの入力に基づいて目標を調整します。 対象プラットフォームごとのメモリ予算を設定します。
| プラットフォーム | 合計 RAM | ゲーム予算 | 備考 |
|---|---|---|---|
| PC(最低仕様) | 8 GB | 4 GB | OS 用の余裕を確保 |
| PS5 | 16 GB | 12 GB | ユニファイドメモリ |
| Xbox Series X | 16 GB | 13 GB | Smart Delivery 使用時 |
| Switch | 4 GB | 2.5 GB | 厳しい制約 |
| モバイル | 4-6 GB | 1.5-2 GB | バックグラウンドアプリ |
| シナリオ | 目標 | 最大 |
|---|---|---|
| 初回起動 | < 10s | 30s |
| レベル読み込み | < 15s | 30s |
| ファストトラベル | < 5s | 10s |
| リスポーン | < 3s | 5s |
ジャンルに応じて調整します(例:一本道のゲームでは、ファストトラベルが適用されない場合があります)。
フレームレート検証用のストレステストシナリオを定義します。 ``` SCENARIO: Maximum Entity Count GIVEN game level with normal enemy spawn WHEN enemy count reaches 50+ THEN frame rate stays above minimum AND no visual artifacts AND audio doesn't stutterSCENARIO: Particle System Stress GIVEN combat with multiple effects WHEN 20+ particle systems active THEN frame rate degradation < 20% AND memory allocation stable
SCENARIO: Draw Call Stress GIVEN level with maximum visible geometry WHEN camera shows worst-case view THEN frame rate stays above minimum AND no hitching or stuttering
</action>
<action>メモリテストシナリオを定義します。
SCENARIO: Extended Play Session GIVEN game running for 4+ hours WHEN normal gameplay occurs THEN memory usage remains stable AND no memory leaks detected AND no crash from fragmentation
SCENARIO: Level Transition GIVEN player completes level WHEN transitioning to new level THEN previous level fully unloaded AND memory baseline returns AND no cumulative growth
</action>
<action>読み込みテストシナリオを定義します。
SCENARIO: Cold Boot GIVEN game not in memory WHEN launching game THEN reaches interactive state in < target AND loading feedback shown AND no apparent hang
SCENARIO: Save/Load Performance GIVEN large save file (max progress) WHEN loading save THEN completes in < target AND no corruption AND gameplay resumes smoothly
</action>
<action>シナリオの詳細を、特定したゲームの種類とシステムに合わせて調整します。</action>
</step>
<step n="3" goal="テスト方法を定義する">
<action>検出したエンジン向けに、自動パフォーマンステストコードを生成します。</action>
<check if="engine == 'unity'">
<action>Unity Performance Test Runner の例を生成します。
```csharp
[UnityTest]
public IEnumerator Performance_CombatScene_MaintainsFPS()
{
using (Measure.ProfilerMarkers(new[] { "Main Thread" }))
{
SceneManager.LoadScene("CombatStressTest");
yield return new WaitForSeconds(30f);
}
var metrics = Measure.Custom(new SampleGroupDefinition("FPS"));
Assert.Greater(metrics.Median, 30, "FPS should stay above 30");
}
</action>
Unreal Automation テストの例を生成します。
```cpp
bool FPerformanceTest::RunTest(const FString& Parameters)
{
float StartTime = FPlatformTime::Seconds();
for (int i = 0; i < 100; i++)
GetWorld()->SpawnActor();
float FrameTime = FApp::GetDeltaTime();
TestTrue("Frame time under budget", FrameTime < 0.033f);
return true;
}
```
Godot ベンチマークテストの例を生成します。
```gdscript
func test_performance_entity_stress():
var frame_times = []
for i in range(100):
var entity = stress_entity.instantiate()
add_child(entity)
for i in range(300):
await get_tree().process_frame
frame_times.append(Performance.get_monitor(Performance.TIME_PROCESS))
var avg_frame_time = frame_times.reduce(func(a, b): return a + b) / frame_times.size()
assert_lt(avg_frame_time, 0.033, "Average frame time under 33ms (30 FPS)")
```
手動プロファイリング用チェックリストを定義します。
CPU プロファイリング
- エンジンのプロファイラーを使用してホットスポットを特定する
- GC の頻度と割り当ての負荷を確認する
- マルチスレッドの使用状況とスレッド競合を検証する
GPU プロファイリング
- 対象シーンでのドローコール数
- 複雑な領域でのオーバードロー分析
- シェーダーの複雑さの評価
メモリプロファイリング
- 30 分間のセッションにおけるヒープ割り当てのパターン
- カテゴリー別のアセットメモリ使用量
- 複数回のレベル読み込みを通じたメモリリーク検出
| ベンチマーク | 目的 | 期間 |
|---|---|---|
| 戦闘ストレス | エンティティとエフェクトの最大数 | 60s |
| オープンワールド | 描画距離とストリーミング | 120s |
| メニュー操作 | UI のパフォーマンス | 30s |
| セーブ/ロード | 永続化のパフォーマンス | 30s |
# Performance Test Plan: {project_name}
## Performance Targets
[FPS tables filtered to target platforms]
[Memory budget tables]
[Loading time targets]
## Test Scenarios
### Frame Rate Tests
[Stress test scenarios from Step 2]
### Memory Tests
[Extended play and leak detection scenarios]
### Loading Tests
[Boot, level load, save/load scenarios]
## Methodology
### Automated Tests
[Engine-specific code examples]
[CI integration instructions]
### Manual Profiling
[Checklists from Step 3]
[Tools to use per engine]
## Benchmark Suite
[Benchmark definitions from Step 4]
[Baseline capture process]
[Regression thresholds]
## Platform Matrix
[Platform-specific requirements from Step 5]
## Regression Criteria
[Quantified thresholds: FPS drop %, memory growth %, load time delta]
[CI gate configuration]
## Schedule
[When performance tests run: nightly, per-sprint, pre-release]
[Who reviews results and owns regressions]
`{validation}` チェックリストを読み込み、適用して、すべての成果物が完成していることを確認します
作成した内容の概要と、推奨する次のステップをユーザーに提示します
次を実行します:`uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow.on_complete` — 解決された値が空でない場合は、終了前の最後のターミナル指示としてそれに従います。