#!/usr/bin/env bash # 시뮬레이터 하드웨어 프로파일링 (Tracy). 뷰어는 TRACY_ON_DEMAND 로 빌드돼 있어 캡처가 붙을 때만 기록한다. # # bash scripts/profile.sh OUT.tracy -- # 캡처를 띄우고 명령을 돌린 뒤 .tracy 저장 + 구간 통계 출력 (창 없이도 된다: --offscreen) # build/tracy-profiler/tracy-profiler OUT.tracy 저장한 캡처를 GUI 로 (CPU·GPU 타임라인, 패스별 GPU 구간) # build/tracy-profiler/tracy-profiler 실행 중인 시뮬레이터(nusim render view)에 실시간으로 붙기 # # 기록되는 것: CPU 구간 (render·record·gpu wait·pass·png queue/encode), GPU 구간 (렌더 그래프 패스·그리기 항목, # Vulkan 타임스탬프), 프레임 경계, 그래프 (보이는 가우시안 수, 속도). set -eo pipefail : "${1:?사용: bash scripts/profile.sh OUT.tracy -- <명령...>}" out=$(realpath -m "$1"); shift # 저장소 루트로 옮기기 전에 절대 경로로 [ "${1:-}" = "--" ] && shift [ $# -gt 0 ] || { echo "명령이 없습니다: bash scripts/profile.sh OUT.tracy -- <명령...>" >&2; exit 2; } cd "$(dirname "$0")/.." source scripts/local_env.sh >/dev/null [ -x build/tracy-capture/tracy-capture ] || bash scripts/build_tracy.sh build/tracy-capture/tracy-capture -o "$out" -f > "${out%.tracy}.capture.log" 2>&1 & cap=$! trap 'kill $cap 2>/dev/null || true' EXIT # 명령이 실패해도 캡처를 남기지 않는다 sleep 1 rc=0 "$@" || rc=$? # 캡처는 클라이언트가 끊기면 끝난다. 명령이 캡처가 붙기 전에 끝났으면 기다리지 않는다 (최대 30초) for _ in $(seq 60); do kill -0 $cap 2>/dev/null || break; sleep 0.5; done kill -0 $cap 2>/dev/null && { echo "캡처가 연결되지 않았습니다 (명령이 너무 빨리 끝남?)" >&2; kill $cap; exit 1; } trap - EXIT [ $rc -eq 0 ] || { echo "명령 실패 (종료 코드 $rc)" >&2; exit $rc; } echo "캡처 → $out" build/tracy-csvexport/tracy-csvexport "$out" | awk -F, 'NR > 1 { printf " %-14s 횟수 %6d 평균 %9.3f ms 합 %9.1f ms\n", $1, $6, $7 / 1e6, $4 / 1e6 }'