Tracy Profiler - مرتجل الإطار الفعلي
Tracy هو مرتجل الإطار الحقيقي والعينة الهجينة بدقة nanosecond، يُستخدم على نطاق واسع في الألعاب و C++ و Rust منخفضة الكمون. تضيف zone macros خفيفة الوزن إلى الرمز الخاص بك، و Tracy بث بيانات التوقيت حيًا إلى واجهة سطح المكتب حيث يمكنك رؤية كل إطار، كل منطقة، توقيتات GPU، تخصيصات الذاكرة، و contention قفل كما يعمل البرنامج. الجمع بين الآلات اليدوية بالإضافة إلى أخذ العينات التلقائي يعطي كلا المناطق الدقيقة الدلالية والبقع الساخنة غير المنسوبة.
التثبيت
| المكون | كيف |
|---|
| الخادم (واجهة المستخدم) | بناء profiler/ من الريبو أو تحميل إصدار |
| العميل (المكتبة) | أضف TracyClient.cpp + الرؤوس إلى البناء الخاص بك |
| Rust | cargo add tracy-client (أو tracing-tracy) |
| تمكين | جمع مع TRACY_ENABLE محدد |
| التحقق | إطلاق واجهة المستخدم؛ فهي تنتظر اتصال عميل |
آلات C++
#include "tracy/Tracy.hpp"
void update() {
ZoneScoped; // منطقة سميت بعد الدالة
physics();
}
void render() {
ZoneScopedN("Render Pass"); // اسم صريح
ZoneColor(0x00FF00);
draw();
}
int main() {
while (running) {
update();
render();
FrameMark; // تحديد حدود الإطار
}
}
| الماكرو | الغرض |
|---|
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 مع صندوق tracing-tracy بحيث تظهر الفترات الموجودة تلقائيًا في Tracy.
الذاكرة و GPU
| الميزة | كيف |
|---|
| تتبع التخصيص | TracyAlloc(ptr, size) / TracyFree(ptr) |
| محسوبات مخصصة | Wrap alloc/free مع الماكروس |
| مناطق GPU (Vulkan/D3D/OpenGL) | TracyVkZone, TracyD3D12Zone, إلخ. |
| سياق GPU | إنشاء مرة واحدة، ثم المناطق تعلق به |
واجهة المستخدم
| عرض | يعرض |
|---|
| الخط الزمني | مناطق لكل خيط، إطار تلو الآخر |
| الإحصائيات | وقت إجمالي لكل منطقة |
| البحث عن المنطقة | الرسم البياني لمدد منطقة واحدة |
| مقارنة | فرق بين لقطتين (قبل/بعد التغيير) |
| الذاكرة | خط الوقت للتخصيصات والتسريبات |
| أقفال | Contention بين الخيوط |
| مخطط اللهب | هيكل الاستدعاء المجمع |
سير العمل: مطاردة كسب الإطار
| خطوة | إجراء |
|---|
| 1 | تشغيل مع اتصال العميل؛ إعادة إنتاج الكسب |
| 2 | البحث عن الإطار الطويل في الخط الزمني |
| 3 | التكبير — أي منطقة تهيمن؟ |
| 4 | فتح “منطقة البحث” لتلك المنطقة → مدة الرسم البياني |
| 5 | تحقق من سياق الشذوذ (الأقفال والتخصيصات وانتظار GPU) |
| 6 | إصلاح، التقط مرة أخرى، استخدم مقارنة لإثبات التحسين |
سير عمل مقارن بين لقطتين هو أحد أكثر ميزات Tracy عملية — فهو يحول “يبدو أسرع” إلى فرق مقاس.
وضع العينات
بعد المناطق اليدوية، يمكن لـ Tracy أخذ عينات من مكاده استدعاء تلقائيًا (Linux/Windows)، وتكملة الوقت في رمز لم تقم بآلاته. الجمع بين الاثنين: المناطق تعطي بنية دلالية، أخذ العينات يملأ الثغرات.
Tracy مقابل المرتجلين ذوي الصلة
| الجانب | Tracy | perf | Perfetto |
|---|
| نموذج | مناطق محبوكة + عينات | أخذ عينات | تتبع في جميع أنحاء النظام |
| الدقة | Nanosecond | فترة العينة | مستوى الحدث |
| عرض مباشر | نعم (فعلي) | لا | بعد العملية |
| دعم GPU | مدمج | لا | جزئي |
| الأفضل لـ | الألعاب والإطار والكمون المنخفض C++/Rust | مسارات CPU الساخنة | خطوط الوقت في جميع أنحاء النظام |
يكمل perf و Perfetto؛ ميزة Tracy هي الحياة والإطار والمحبوك ملف التعريف.
الموارد