間線揪出卡頓元兇)
15分鐘跑通Tracy Profiler用納秒級時(shí)間線揪出卡頓元兇【免費(fèi)下載鏈接】tracyFrame profiler項(xiàng)目地址: https://gitcode.com/GitHub_Trending/tr/tracy幀率曲線突然掉了一個(gè)尖刺你翻遍日志找不到是哪段邏輯吃掉了2毫秒。 打日志排查更慢等你抓到現(xiàn)場異常早沒了。 Tracy Profiler幀分析器是一款實(shí)時(shí)、納秒精度的混合幀采樣分析工具。它作為獨(dú)立進(jìn)程運(yùn)行在你玩游戲時(shí)逐線程記錄每個(gè)周期在干什么接上時(shí)間線視圖后卡頓就變成了可以縮放的色塊。一句話定位實(shí)時(shí)應(yīng)用的示波器Tracy之于實(shí)時(shí)應(yīng)用性能就像示波器之于電路程序不需要知道自己正被觀察波形自顧自地流過去。它的本質(zhì)由三點(diǎn)構(gòu)成客戶端-服務(wù)器架構(gòu)客戶端庫嵌進(jìn)你的程序服務(wù)器是獨(dú)立的圖形界面。兩者走網(wǎng)絡(luò)通信同一局域網(wǎng)里的手機(jī)、嵌入式設(shè)備也能接上分析。幀采樣混合手動標(biāo)記區(qū)域Zone帶精確時(shí)間戳的代碼段拿到微秒級邊界不想改代碼時(shí)調(diào)用棧采樣sampling定期抓取線程正在執(zhí)行的函數(shù)鏈會告訴你線程此刻在哪。極低開銷單個(gè)事件納秒級開著分析器跑程序行為幾乎不變。三行CMake接入最小示例先拿到源碼git clone https://gitcode.com/GitHub_Trending/tr/tracy。然后在項(xiàng)目的 CMakeLists.txt 里加三行add_subdirectory(tracy) target_compile_definitions(mygame PRIVATE TRACY_ENABLE) target_link_libraries(mygame Tracy::TracyClient)客戶端真正編譯的源文件只有public/TracyClient.cpp一個(gè)TRACY_ENABLE 是總開關(guān)不定義它時(shí)所有宏都會被剔除。再在游戲主循環(huán)末尾放一個(gè)幀標(biāo)記#include tracy/Tracy.hpp while (running) { Update(); Render(); FrameMark; // 一幀的結(jié)束標(biāo)記 }編譯前先構(gòu)建 Tracy 倉庫本身產(chǎn)出服務(wù)器 GUIcmake -B build -DCMAKE_BUILD_TYPERelease cmake --build build產(chǎn)出的可執(zhí)行文件就是服務(wù)器?,F(xiàn)在先啟動它再啟動你的游戲記得用開了 TRACY_ENABLE 的構(gòu)建。服務(wù)器會通過局域網(wǎng)廣播自動發(fā)現(xiàn)客戶端主界面右上方出現(xiàn)連接時(shí)間線上會開始流動綠色幀塊——每一塊就是一幀寬度即幀時(shí)長。追一個(gè)3ms到12ms的尖刺縮放到全局視角能看到一條平時(shí)穩(wěn)定在3ms的線程某一幀突然拉到12ms上方幀統(tǒng)計(jì)條同步變紅。從哪下手在可疑函數(shù)里放 ZoneScoped。它是 RAII 宏函數(shù)入口開區(qū)域、出口自動關(guān)不用手動配對void ProcessPhysics(float dt) { ZoneScoped; // 自動命名為 ProcessPhysics // 物理計(jì)算 }重新跑一遍時(shí)間線上那個(gè)12ms的塊就被細(xì)分成了函數(shù)色塊。往下鉆的時(shí)候區(qū)域也可以起自定義名字并高亮void CheckCollision(Entity a, Entity b) { ZoneScopedN(CollisionTest); // 自定義名稱 ZoneColor(0xff40ff); // 品紅色高亮 }接下來打開統(tǒng)計(jì)視圖Statistics按總耗時(shí)排序會發(fā)現(xiàn)12ms里有9ms在 CollisionTest 內(nèi)部雙擊該區(qū)域放大單擊函數(shù)名就會帶出源碼。源碼視圖提供逐行耗時(shí)占比旁邊并排是反匯編disassembly機(jī)器碼的匯編表示方便對照熱點(diǎn)指令這里的根因是碰撞的寬相粗篩檢查每幀遍歷整個(gè)實(shí)體列表而那幀實(shí)體數(shù)恰好到峰值。改成隔幀執(zhí)行尖刺消失。想留下修復(fù)前后的證據(jù)可以用 Compare 視圖疊加兩次抓取的統(tǒng)計(jì)差異。順帶一提采樣視圖默認(rèn)開啟Linux 上以10kHz頻率抓調(diào)用??捎?TRACY_SAMPLING_HZ 調(diào)整。它補(bǔ)上了手動標(biāo)記覆蓋不到的代碼比如系統(tǒng)庫內(nèi)部。避坑指南新手最容易踩的四個(gè)坑連上了但時(shí)間線一片空白。根因編譯時(shí)沒定義 TRACY_ENABLE宏全部被剔除。 解法單獨(dú)建一個(gè)開 profiling 的構(gòu)建配置再編譯配置細(xì)節(jié)見官方手冊。分析出的耗時(shí)比線上大一倍。根因你分析的是 Debug 構(gòu)建未優(yōu)化代碼和斷言檢查完全改變了程序行為。 解法永遠(yuǎn)用 Release優(yōu)化配置做分析并開啟 -marchnative 這類本機(jī)指令集選項(xiàng)。時(shí)間線有段空白不知道線程在干什么。根因那段代碼沒有 Zone 標(biāo)記且采樣沒開。 解法確認(rèn) TRACY_NO_SAMPLING 沒有被啟用采樣默認(rèn)是開的。鏈接報(bào)錯(cuò)符號后面帶一串奇怪后綴。根因Tracy 把構(gòu)建選項(xiàng)編碼進(jìn)符號名做鏈接期自檢客戶端庫和應(yīng)用程序的選項(xiàng)不一致。 解法兩邊用同一套 TRACY_* 選項(xiàng)編譯。接下來可以探索的方向GPU 時(shí)間線接上后服務(wù)器會為 GPU 單開一行按圖形 API 各自有頭文件如public/tracy/下的 TracyVulkan.hpp、TracyOpenGL.hpp提交命令隊(duì)列后時(shí)間線上會出現(xiàn)對應(yīng)的色塊。零改動分析動不了源碼時(shí)純靠采樣也能先看清線程去向再決定在哪里補(bǔ)標(biāo)記。Python 與數(shù)據(jù)導(dǎo)出python/tracy_client/下有 Python 綁定統(tǒng)計(jì)表格可用csvexport/里的工具導(dǎo)出 CSV進(jìn)電子表格繼續(xù)分析。完整示例examples/ToyPathTracer 展示了渲染器里完整的埋位方式配合官方手冊逐章對照。Tracy 最容易被低估的恰恰是采樣一行標(biāo)記代碼都不寫它也會周期性拍下每個(gè)線程的調(diào)用棧快照告訴你程序那一刻正在執(zhí)行什么——分析器不等程序配合自己就會開始工作?!久赓M(fèi)下載鏈接】tracyFrame profiler項(xiàng)目地址: https://gitcode.com/GitHub_Trending/tr/tracy創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考