Tracy 프로파일러 - 실시간 프레임 프로파일러 치트시트
Tracy는 실시간, 나노초 해상도 하이브리드 프레임 및 샘플링 프로파일러로, 게임 및 저지연시간 C++과 Rust에서 널리 사용됩니다. 코드에 가벼운 영역 매크로를 추가하고, Tracy는 데스크톱 UI로 타이밍 데이터를 실시간으로 스트리밍하는데, 모든 프레임, 모든 영역, GPU 타이밍, 메모리 할당, 그리고 프로그램이 실행되는 동안 락 경쟁을 볼 수 있습니다. 수동 도구화와 자동 샘플링의 조합은 정밀 의미 영역과 기여할 수 없는 핫스팟을 모두 제공합니다.
설치
| 컴포넌트 | 방법 |
|---|
| 서버 (UI) | repo에서 profiler/를 빌드하거나 릴리스 다운로드 |
| 클라이언트 (라이브러리) | 빌드에 TracyClient.cpp + 헤더 추가 |
| Rust | cargo add tracy-client (또는 tracing-tracy) |
| 활성화 | TRACY_ENABLE 정의로 컴파일 |
| 확인 | UI 시작; 클라이언트 연결을 기다림 |
C++ 도구화
#include "tracy/Tracy.hpp"
void update() {
ZoneScoped; // zone named after the function
physics();
}
void render() {
ZoneScopedN("Render Pass"); // explicit name
ZoneColor(0x00FF00);
draw();
}
int main() {
while (running) {
update();
render();
FrameMark; // marks a frame boundary
}
}
| 매크로 | 목적 |
|---|
ZoneScoped | 인클로징 범위 시간 |
ZoneScopedN("name") | 명명된 영역 |
ZoneText(str, len) | 영역에 텍스트 첨부 |
FrameMark | 프레임 경계 분할 |
TracyPlot("fps", v) | 시간에 따른 수치 값 플롯 |
TracyMessage(...) | 메시지를 타임라인에 로깅 |
TracyLockable(...) | 뮤텍스의 경쟁 추적 |
Rust 도구화
use tracy_client::{Client, span};
fn main() {
let _client = Client::start();
loop {
{
let _s = span!("update");
update();
}
tracy_client::frame_mark();
}
}
또는 tracing-tracy 크레이트로 tracing에 연결하면 기존 범위가 Tracy에 자동으로 표시됩니다.
메모리 및 GPU
| 기능 | 방법 |
|---|
| 할당 추적 | TracyAlloc(ptr, size) / TracyFree(ptr) |
| 맞춤형 할당자 | 할당/해제를 매크로로 래핑 |
| GPU 영역 (Vulkan/D3D/OpenGL) | TracyVkZone, TracyD3D12Zone 등 |
| GPU 컨텍스트 | 한 번 생성, 그러면 영역이 연결 |
UI
| 보기 | 표시 |
|---|
| Timeline | 스레드당 영역, 프레임별 |
| Statistics | 영역당 총 시간 |
| Find zone | 한 영역의 기간 히스토그램 |
| Compare | 두 캡처 비교 (변경 전/후) |
| Memory | 할당 타임라인 및 누수 |
| Locks | 스레드 간 경쟁 |
| Flame graph | 통합 호출 구조 |
워크플로: 프레임 스파이크 추적
| 단계 | 동작 |
|---|
| 1 | 클라이언트가 연결된 상태로 실행; 히치 재현 |
| 2 | 타임라인에서 긴 프레임 찾기 |
| 3 | 확대 — 어느 영역이 지배하는가? |
| 4 | 해당 영역에 대해 “Find Zone” 열기 → 기간 히스토그램 |
| 5 | 아웃라이어의 컨텍스트 확인 (락, 할당, GPU 대기) |
| 6 | 수정, 다시 캡처, Compare를 사용하여 개선을 증명 |
그 두 캡처 비교 워크플로는 Tracy의 가장 실용적인 기능 중 하나입니다 — “더 빠른 것 같아”를 측정된 델타로 변환합니다.
샘플링 모드
수동 영역을 넘어서, Tracy는 자동으로 호출 스택을 샘플할 수 있습니다 (Linux/Windows), 도구화하지 않은 코드에서 시간을 잡습니다. 둘 다 결합하세요: 영역은 의미 구조를 주고, 샘플링은 간격을 채웁니다.
Tracy vs 관련 프로파일러
| 측면 | Tracy | perf | Perfetto |
|---|
| 모델 | 도구화된 영역 + 샘플링 | 샘플링 | 시스템 전체 추적 |
| 해상도 | 나노초 | 샘플 간격 | 이벤트 레벨 |
| 실시간 보기 | 예 (실시간) | 아니오 | 사후 |
| GPU 지원 | 기본 제공 | 아니오 | 부분 |
| 최고의 용도 | 게임, 프레임 기반, 저지연 C++/Rust | CPU 핫 경로 | 전체 시스템 타임라인 |
perf와 Perfetto를 보완합니다; Tracy의 장점은 라이브, 프레임 지향, 도구화된 프로파일링입니다.
리소스