Agent skill

Game Performance Profiler

by Donchitos in Donchitos/Claude-Code-Game-Studios

Finds performance bottlenecks, measures them against frame, draw-call and memory budgets, and ranks the optimization recommendations.

MITAuto-check: notesGame Development

Install Game Performance Profiler

skills CLI
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill perf-profile -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Donchitos/Claude-Code-Game-Studios perf-profile --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/perf-profile .claude/skills/perf-profile && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
perf-profile
GitHub stars
26k
Token cost
~2.5k tokens
SKILL.md length
1,171 words
Files
1
Skills in repo
73
Repo updated
First seen
Licence
MIT

At a glance

Finds performance bottlenecks, measures them against frame, draw-call and memory budgets, and ranks the optimization recommendations.

  • Works in 7 steps: Resolve Budget Enforcement → Determine Scope → Load Performance Budgets → …
  • Investigating a frame-rate drop in a game build
  • SKILL.md covers Insufficient input — check…, Phase 0: Resolve Budget…, Phase 1: Determine Scope and Phase 2: Load Performance…, plus 5 more sections
  • Calls bash

What it does

The skill profiles a game against the budgets in the project config: target framerate, frame time in milliseconds, draw call limit and memory ceiling. A `performance.enforce` setting decides what a violation means. At the default `warn` level, violations are reported as findings, and CI logs them without failing.

Before reporting, it lists its inputs, such as profiler output, test results and source code, and marks each as found or absent. Missing data becomes a NOT ASSESSED section instead of an estimate, which prevents false passes like claiming headroom when no profiler data or budget exists. The result is a set of findings with ranked optimization recommendations.

When your agent uses it

  • Investigating a frame-rate drop in a game build
  • Checking whether a game meets its frame time, draw call and memory budgets
  • Getting a ranked list of optimizations to try first

Example prompts

  • “Profile the combat scene and tell me where we exceed our frame budget.”
  • “Check the current build against our draw call limit and memory ceiling.”
  • “Rank the performance fixes worth doing before the beta.”

Requirements

  • Profiler output and budget settings in the project config
  • Pre-approved tools (allowed-tools): Read, Glob, Grep, Write, Bash, Bash(bash "*/.claude/skills/perf-profile/../../hooks/yaml-helper.sh" resolve_config *)

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Resolve Budget Enforcement
  2. Determine Scope
  3. Load Performance Budgets
  4. Analyze Codebase
  5. Generate Profiling Report
  6. Scope and Timeline Decision
  7. Next Steps

What it can do on your machine

Read from SKILL.md and the folder at commit b21fa0f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Glob
    • Grep
    • Write
    • Bash
    • Bash(bash "*/.claude/skills/perf-profile/../../hooks/yaml-helper.sh" resolve_config *)

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • bash

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Game Performance Profiler loads about 2.5k tokens when it runs. Until then it costs about 31 tokens; SKILL.md has 1,171 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~31
When it runs · the whole SKILL.md, loaded when a task matches
~2.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Read, Glob, Grep, Write, Bash, Bash(bash "*/.claude/skills/perf-profile/../../hooks/yaml-helper.sh" 

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Donchitos/Claude-Code-Game-Studios at commit b21fa0f, republished under its MIT licence (© Donchitos). 1,171 words, ~2,483 tokens.

Download SKILL.mdSave it as .claude/skills/perf-profile/SKILL.md (or your agent's skills folder).
name
perf-profile
description
Performance profiling — find bottlenecks, measure against budgets, produce ranked optimization recommendations.
allowed-tools
Read, Glob, Grep, Write, Bash, Bash(bash "*/.claude/skills/perf-profile/../../hooks/yaml-helper.sh" resolve_config *)
argument-hint
[system-name or 'full']
user-invocable
true
model
sonnet

!bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys performance.enforce,automation

Resolved above — use as-is. No block → defaults in .claude/docs/config-resolution.md.

Every AskUserQuestion call follows .claude/docs/automation-modes.md (collaborative asks always · guided major-only · autonomous logs and proceeds; automation_always_ask categories always prompt).

Insufficient input — check this before producing any report

If the inputs this skill needs do not exist, the answer is "could not run" — not a filled-in report. Check first, and stop if the check fails.

  1. List the inputs this skill reads (data files, prior reports, profiler output, test results, registries, source code).
  2. For each, record FOUND or ABSENT — not "assumed present".
  3. If any input required for a section is ABSENT, that section is NOT ASSESSED — NO DATA. Do not estimate it, do not infer it from an adjacent artifact, and do not leave a mandated cell to be filled by whoever reads the template next.
  4. If every required input is ABSENT, stop and report NOT ASSESSED — NO DATA as the whole verdict, naming what was missing and which skill produces it.

A verdict of NOT ASSESSED is a success. It is the correct, useful answer to "what does the data say?" when there is no data. The failure mode this prevents is specific and has been observed in practice: report templates whose verdict enum had no "could not run" state produced false clean passes — an asset audit returning COMPLIANT on a project with no assets and no standards, and a performance profile reporting ">99% headroom against a 16.67ms budget" with zero profiler data and no budget ever set.

Absence of evidence is never evidence of absence. A scan that finds no matches because there are no files to scan has not verified anything. Say which of the two happened — a reader cannot tell from a green result.


Phase 0: Resolve Budget Enforcement

performance.enforce decides what a budget violation means in this run. It does not change which budgets are measured — performance.target_framerate, frame_budget_ms, draw_call_limit and memory_ceiling_mb are profiled the same way at every level:

ValueEffect on this profile's findings
warn (default)Violations are reported as findings. They do not block; CI logs them without failing.
blockViolations are blockers. Say so explicitly in the report — a block project treats an over-budget system as release-stopping, and /gate-check will FAIL the Polish gate on it.
offBudgets are informational only. Still report measured values, but do not raise violations as findings or recommendations to fix.

Only warn, block and off are recognized. Surface any other value to the user and fall back to warn rather than guessing.

The value is locally overridable (/settings --local performance.enforce=block), so use the resolved block above rather than reading project.yaml — a teammate's stricter local setting is meant to bite on their machine only.

Phase 1: Determine Scope

Read the argument:

  • System name → focus profiling on that specific system
  • full → run a comprehensive profile across all systems

Phase 2: Load Performance Budgets

Read the committed budgets from config first — they are the project's record of what it agreed to, and design docs are the fallback, not the source:

bash
source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null
get_effective_yaml_key performance.target_framerate
get_effective_yaml_key performance.frame_budget_ms
get_effective_yaml_key performance.draw_call_limit
get_effective_yaml_key performance.memory_ceiling_mb

Written as four literal keys rather than a loop over leaf names, deliberately. The dead-settings audit matches the full dotted key, so a loop building performance.$k leaves three of the four spelled nowhere and the audit reports them DEAD while this skill reads them. Spell each key out in full.

Resolve these budgets from project.yaml, not from prose. Phase 0 above states these four budgets "are profiled the same way at every level". Sending the reader to "design docs or CLAUDE.md" instead means a user who set performance.target_framerate: 60 in project.yaml has it ignored by the one skill that profiles against budgets. The keys resolve correctly — this phase has to actually ask for them.

Then fall back to design docs or CLAUDE.md for anything config does not carry:

  • Target FPS (e.g., 60fps = 16.67ms frame budget)
  • Memory budget (total and per-system)
  • Load time targets
  • Draw call budgets
  • Network bandwidth limits (if multiplayer)

A metric with no committed budget is NOT ASSESSED, not a pass. Do not measure against the template's [16.67ms] placeholder — an unset budget is not a budget that was met, and reporting headroom against a number nobody chose is the exact fabrication this skill's own header warns about.


Show full SKILL.md (466 more words)Show less

Phase 3: Analyze Codebase

CPU Profiling Targets:

  • _process() / Update() / Tick() functions — list all and estimate cost
  • Nested loops over large collections
  • String operations in hot paths
  • Allocation patterns in per-frame code
  • Unoptimized search/sort over game entities
  • Expensive physics queries (raycasts, overlaps) every frame

Memory Profiling Targets:

  • Large data structures and their growth patterns
  • Texture/asset memory footprint estimates
  • Object pool vs instantiate/destroy patterns
  • Leaked references (objects that should be freed but aren't)
  • Cache sizes and eviction policies

Rendering Targets (if applicable):

  • Draw call estimates
  • Overdraw from overlapping transparent objects
  • Shader complexity
  • Unoptimized particle systems
  • Missing LODs or occlusion culling

I/O Targets:

  • Save/load performance
  • Asset loading patterns (sync vs async)
  • Network message frequency and size

Phase 4: Generate Profiling Report

Write the report to production/polish/[scope]-report-[date].md, asking first per the Collaboration Protocol: "May I write this profiling report to production/polish/[scope]-report-[date].md?" Create the directory if absent.

Name the destination — do not just render the template into the conversation. A profile that lives only in the transcript is gone the moment the session ends, and no two runs can be compared. production/polish/ is the same location /team-polish writes, deliberately: a profile taken by either route belongs in one place, or the comparison this skill exists to enable cannot be made.

If a NOT ASSESSED section survives into the report, keep it in the written file. A profile whose gaps are edited out on the way to disk reads, later, as a complete measurement.

markdown
## Performance Profile: [System or Full]
Generated: [Date]

### Performance Budgets
| Metric | Budget | Estimated Current | Status |
|--------|--------|-------------------|--------|
| Frame time | [16.67ms] | [estimate] | [OK/WARNING/OVER/NOT ASSESSED] |
| Memory | [target] | [estimate] | [OK/WARNING/OVER/NOT ASSESSED] |
| Load time | [target] | [estimate] | [OK/WARNING/OVER/NOT ASSESSED] |
| Draw calls | [target] | [estimate] | [OK/WARNING/OVER/NOT ASSESSED] |

### Hotspots Identified
| # | Location | Issue | Estimated Impact | Fix Effort |
|---|----------|-------|------------------|------------|

### Optimization Recommendations (Priority Order)
1. **[Title]** — [Description]
   - Location: [file:line]
   - Expected gain: [estimate]
   - Risk: [Low/Med/High]
   - Approach: [How to implement]

### Quick Wins (< 1 hour each)
- [Simple optimization 1]

### Requires Investigation
- [Area that needs actual runtime profiling to confirm impact]

Output the report with a summary: top 3 hotspots, estimated headroom against each budget that is set — for a metric with none, no budget set — headroom not assessed — and recommended next action.


Phase 5: Scope and Timeline Decision

Activate this phase only if any hotspot has Fix Effort rated M or L.

Present significant-effort items and ask the user to choose for each:

  • A) Implement the optimization (proceed with fix now or schedule it)
  • B) Reduce feature scope (run /scope-check [feature] to analyze trade-offs)
  • C) Accept the performance hit and defer to Polish phase (log as known issue)
  • D) Escalate to technical-director for an architectural decision (run /architecture-decision)

If multiple items are deferred to Polish (choice C), record them under ### Deferred to Polish.


Verdict

Close every run that produced a report — whether or not Phase 5 ran — with: Verdict: COMPLETE — performance profile generated (saved to production/polish/[scope]-report-[date].md if the write was approved). The only other outcome is the NOT ASSESSED — NO DATA path above.


Phase 6: Next Steps

  • If bottlenecks require architectural change: run /architecture-decision.
  • If scope reduction is needed: run /scope-check [feature].
  • To schedule optimizations: run /sprint-plan update.
Rules
  • Never optimize without measuring first — gut feelings about performance are unreliable
  • Recommendations must include estimated impact — "make it faster" is not actionable
  • Profile on target hardware, not just development machines
  • Static analysis (this skill) identifies candidates; runtime profiling confirms

© Donchitos, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/perf-profile of Donchitos/Claude-Code-Game-Studios.

Open the folder on GitHubat commit b21fa0f

Compare with similar skills

Game Performance Profiler next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Game Performance Profiler compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Game Performance Profiler this skillDonchitos/Claude-Code-Game-Studios26k—~2.5kAutomated safety check: NotesMIT
Profiler Capture FrameIvanMurzak/Unity-MCP4.4k1 repos~839Automated safety check: PassApache-2.0
Profiler Get Rendering StatsIvanMurzak/Unity-MCP4.4k1 repos~833Automated safety check: PassApache-2.0
Profiler Get StatusIvanMurzak/Unity-MCP4.4k1 repos~769Automated safety check: PassApache-2.0
Profiler Save DataIvanMurzak/Unity-MCP4.4k1 repos~501Automated safety check: PassApache-2.0
Profiler StartIvanMurzak/Unity-MCP4.4k1 repos~432Automated safety check: PassApache-2.0

Similar skills

  • Profiler Capture Frame

    IvanMurzak/Unity-MCP

    Capture the current frame's timing info (delta time, FPS, frame counts, runtime).

    4.4k GitHub starsUsed in 1 repo~839 tokens
    Game DevelopmentAuto-check passed
  • Profiler Get Rendering Stats

    IvanMurzak/Unity-MCP

    Return current frame timing, FPS, vsync, target frame rate, threading mode, and graphics device type from Unity Time / QualitySettings / SystemInfo.

    4.4k GitHub starsUsed in 1 repo~833 tokens
    Game DevelopmentAuto-check passed
  • Profiler Get Status

    IvanMurzak/Unity-MCP

    Return the Unity profiler's current enabled state, active modules, max-used memory, and platform support flag.

    4.4k GitHub starsUsed in 1 repo~769 tokens
    Game DevelopmentAuto-check passed
  • Profiler Save Data

    IvanMurzak/Unity-MCP

    Save a snapshot of profiler-derived stats (status + memory + rendering + script + frame capture) to a JSON file.

    4.4k GitHub starsUsed in 1 repo~501 tokens
    Game DevelopmentAuto-check passed
  • Profiler Start

    IvanMurzak/Unity-MCP

    Enable Unity's runtime profiler and open the Profiler window.

    4.4k GitHub starsUsed in 1 repo~432 tokens
    Game DevelopmentAuto-check passed
  • Profiler Stop

    IvanMurzak/Unity-MCP

    Disable Unity's runtime profiler. An agent skill from IvanMurzak/Unity-MCP.

    4.4k GitHub starsUsed in 1 repo~369 tokens
    Game DevelopmentAuto-check passed

More from Donchitos/Claude-Code-Game-Studios

All 73 skills in this repo
  • Game Asset Audit

    Donchitos/Claude-Code-Game-Studios

    Audits game assets against naming conventions, file size budgets and format standards, and finds orphaned assets and missing references.

    26k GitHub stars~2k tokensUpdated 9 days ago
    Auto-check passed
  • Game Asset Spec Writer

    Donchitos/Claude-Code-Game-Studios

    Writes per-asset visual specs and AI image-generation prompts for a game's characters, enemies and screens, driven by the GDD, art bible and an entity inventory.

    26k GitHub stars~5k tokensUpdated 9 days ago
    Auto-check passed
  • Game Balance Check

    Donchitos/Claude-Code-Game-Studios

    Checks game data and formulas for balance outliers, broken progression, degenerate strategies and economy problems, and answers 'could not run' when the data is missing.

    26k GitHub stars~2.2k tokensUpdated 9 days ago
    Auto-check passed
  • Structured Bug Reports

    Donchitos/Claude-Code-Game-Studios

    Turns a description into a structured bug report, or scans code for likely bugs, then verifies and closes reports through four modes.

    26k GitHub stars~2.5k tokensUpdated 9 days ago
    Auto-check: notes
  • Bug Triage

    Donchitos/Claude-Code-Game-Studios

    Reviews the open bug backlog, separates severity from priority, assigns fixes to sprints and reports systemic trends, writing a dated triage file.

    26k GitHub stars~2.3k tokensUpdated 9 days ago
    Auto-check passed
  • Changelog Generator for Games

    Donchitos/Claude-Code-Game-Studios

    Generates an internal or player-facing changelog from git commits and sprint data, filtering out framework maintenance commits so that only work on the game itself reaches release copy.

    26k GitHub stars~2.5k tokensUpdated 9 days ago
    Auto-check: notes

Questions about Game Performance Profiler

What does Game Performance Profiler do?

Finds performance bottlenecks, measures them against frame, draw-call and memory budgets, and ranks the optimization recommendations. The skill profiles a game against the budgets in the project config: target framerate, frame time in milliseconds, draw call limit and memory ceiling.enforce` setting decides what a violation means.

When should I use Game Performance Profiler?

Game Performance Profiler fits situations like: investigating a frame-rate drop in a game build; checking whether a game meets its frame time, draw call and memory budgets; getting a ranked list of optimizations to try first.

How do I install Game Performance Profiler in Claude Code?

Run `npx skills add Donchitos/Claude-Code-Game-Studios --skill perf-profile -a claude-code`. Or copy the skill folder (.claude/skills/perf-profile in Donchitos/Claude-Code-Game-Studios) into .claude/skills/perf-profile in your project. Claude Code loads it when a task matches its description.

How do I install Game Performance Profiler in Codex?

Run `npx skills add Donchitos/Claude-Code-Game-Studios --skill perf-profile -a codex`. Or copy the skill folder (.claude/skills/perf-profile in Donchitos/Claude-Code-Game-Studios) into .agents/skills/perf-profile in your project. Codex loads it when a task matches its description.

Can I use Game Performance Profiler in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Donchitos/Claude-Code-Game-Studios --skill perf-profile -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/perf-profile, .gemini/skills/perf-profile, .github/skills/perf-profile and .opencode/skills/perf-profile in your project.

What does Game Performance Profiler need to run?

Going by SKILL.md and its folder, Game Performance Profiler needs the command-line tools its instructions call (bash). Our summary lists: Profiler output and budget settings in the project config. Its frontmatter pre-approves these tools: Read, Glob, Grep, Write, Bash, Bash(bash "*/.claude/skills/perf-profile/../../hooks/yaml-helper.sh" resolve_config *).

Does Game Performance Profiler access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Game Performance Profiler safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Game Performance Profiler use?

Game Performance Profiler is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Game Performance Profiler use?

About 2.5k tokens (SKILL.md is roughly 9.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Game Performance Profiler?

Skills that share tags, products or a category with Game Performance Profiler: Profiler Capture Frame (IvanMurzak/Unity-MCP, 4.4k stars), Profiler Get Rendering Stats (IvanMurzak/Unity-MCP, 4.4k stars), Profiler Get Status (IvanMurzak/Unity-MCP, 4.4k stars) and Profiler Save Data (IvanMurzak/Unity-MCP, 4.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Game Performance Profiler?

Donchitos (a GitHub user) maintains it in Donchitos/Claude-Code-Game-Studios, which has 25,871 GitHub stars. The repository holds 73 skills in this directory. The repository was last updated on September 29, 2026.

Source: Donchitos/Claude-Code-Game-Studios on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.