kit-app-streaming-debug
Skill34 starsChanged 7 months agoApache-2.0View on GitHub
Use when investigating Kit app livestream performance bottlenecks, WebRTC/native StreamSDK lag, freezes, dropped frames, browser WebRTC stats, copy fence timeouts, NVST_R_BUSY, disconnects, or resolution mismatch warnings in omni.kit.livestream.
In this repository12 other files it gives its agents.
- benchmark-isaaclabSkill
- benchmark-isaacsimSkill
- diagnose-perfSkill
- install-isaaclabSkill
- install-isaacsimSkill
- install-profilersSkill
- nsys-analyzeSkill
- nvtx-pythonSkill
- perf-tuningSkill
- profiling-apiSkill
- profilingSkill
- tracy-memorySkill
The file
We split this skill into the rules it gives an agent
4 rules. About 0 are common, 2 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 12
Run the Kit app with StreamSDK event tracing and verbose file logs.
- Distinctive: line 22
If extension context is needed, also enable:
- Distinctive: line 82
Use Tracy only after logs indicate the server side is involved.
- Very specific: line 88
Use the profiling skill for capture mechanics and nsys-analyze for trace analysis.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Kit App Streaming Debug
Debug Kit livestream performance end-to-end before jumping into generic profiling. Always collect both server-side Kit logs and browser-side WebRTC evidence, then correlate by timestamp around the lag/freeze event.
Collect Kit Evidence
Run the Kit app with StreamSDK event tracing and verbose file logs. Keep --no-window for app-stream tests when resolution mismatch is suspected.
# Windows
.\repo.bat launch -- --no-window --/exts/omni.kit.livestream.app/primaryStream/enableEventTracing=true --/log/channels/omni.kit.livestream.streamsdk=verbose --/log/fileLogLevel=verbose
# Linux
./repo.sh launch -- --no-window --/exts/omni.kit.livestream.app/primaryStream/enableEventTracing=true --/log/channels/omni.kit.livestream.streamsdk=verbose --/log/fileLogLevel=verboseIf extension context is needed, also enable:
--/log/channels/omni.kit.livestream.webrtc=verbose
--/log/channels/omni.kit.livestream.app=verboseExtract the known streaming failure markers:
rg -n -C 3 "Timeout of [0-9]+ms exceeded waiting for copy fence|Cannot stream video frame because the video stream is not connected|Still cannot stream video frame|Cannot stream video frame with resolution|NVST_R_BUSY|Client disconnected from WebRTC server" path/to/kit.logInterpret them this way:
| Marker | Likely cause | Next check |
Timeout of 1000ms exceeded waiting for copy fence | Renderer/GPU stall before the framebuffer copy completes | Correlate with frame time, GPU utilization, and Tracy/NSight render zones |
Cannot stream video frame because the video stream is not connected | WebRTC session has not established, or video stream dropped | Check browser ICE state, connection events, and nearby disconnect logs |
Still cannot stream video frame... | Connection did not recover inside the wait timeout, frame dropped | Treat as stream/session instability, not render cost by itself |
Cannot stream video frame with resolution ... differs... | OS/window resize or AOV/render resolution changed after connect | Try --no-window, fixed resolution, disable viewport fill behavior, or use dynamic resize only if required |
NVST_R_BUSY | StreamSDK is not accepting frames fast enough | If not adjacent to disconnect/reconnect, suspect encoder, network, or client backpressure |
Client disconnected from WebRTC server | Client/session dropped | Align with browser ICE/NACK/PLI/freeze events |
Collect Browser Evidence
Open chrome://webrtc-internals before connecting to the stream. After a lag event, use Create dump and inspect packet loss, jitter, frames dropped, decode time, bitrate, freezes, NACK/PLI, and the selected ICE candidate pair.
For ~/proj/ov-web-rtc, run the dev client with npm run dev and capture console logs. Add or inspect an onStreamStats callback like:
onStreamStats: (message: StatsEvent) => {
const s = message.data.stats;
console.table({
fps: s.fps,
rtdMs: s.rtd,
decodeMs: s.avgDecodeTime,
frameLoss: s.frameLoss,
packetLoss: s.packetLoss,
bandwidthMbps: s.totalBandwidth,
bitrateMbps: s.currentBitrate,
utilizedPct: s.utilizedBandwidth,
resolution: `${s.streamingResolutionWidth}x${s.streamingResolutionHeight}`,
codec: s.codec,
});
}Browser-side interpretation:
| Symptom | Likely bottleneck |
High avgDecodeTime, low packet loss | Client decode/GPU/display bottleneck |
High packetLoss, frameLoss, NACK/PLI, jitter, or freezes | Network or congestion problem |
utilizedBandwidth near 100%, bitrate near/above available bandwidth | Bandwidth cap or congestion control |
| Low browser FPS with clean browser stats but Kit copy-fence/NVST warnings | Server render/copy/encoder/backpressure |
| Browser resolution differs from expected Kit stream resolution | Resize/configuration mismatch |
Profiling Follow-Up
Use Tracy only after logs indicate the server side is involved. Add the profiling args to the same Kit run:
--/app/profilerBackend=tracy --/app/profileFromStart=true --/profiler/gpu/tracyInject/enabled=true --/app/profilerMask=1 --/plugins/carb.profiler-tracy.plugin/fibersAsThreads=false --/profiler/channels/carb.events/enabled=false --/profiler/channels/carb.tasking/enabled=false --/rtx/addTileGpuAnnotations=true --/profiler/enabled=true --/profiler/gpu=true --enable omni.kit.profiler.windowUse the profiling skill for capture mechanics and nsys-analyze for trace analysis. Do not promise StreamSDK-internal zones when StreamSDK source is unavailable; correlate log timestamps with surrounding Kit zones such as SharedFrameBuffer::waitForCopy, SharedFrameBuffer::streamBuffer, render zones, and frame markers.
Report Shape
Summarize:
- Kit run args and log path.
- Browser artifacts: console stats and
webrtc-internalsdump. - Timeline around the lag event.
- Matched markers and likely bottleneck category: renderer/GPU, session/network, resize/config, StreamSDK/encoder backpressure, or client decode.
- Next action: config fix, network/client investigation, or server-side profiling.
Source references in this workspace: ~/proj/kit-livestream for omni.kit.livestream.app and omni.kit.livestream.webrtc; ~/proj/ov-web-rtc for browser stats and dev client logging.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

