mirror of
https://github.com/tangerineturtle1/NX2navi.git
synced 2026-11-15 19:19:58 -04:00
In the 2026-11-13 session three frames of 87, 91 and 96 ms after an area load each counted as a change of pace, as each was followed by one as long, and loads that only the texture pool saw (no area file read, so no scene line) were charged to play. Consecutive long frames are now one episode, counted once with their summed time, its line giving that time and the first frame's parts; a run of more than 8 long frames none of which stands out is still a change of pace. The texture pool's start and end of an area load mark an area load for the map, as the game's own loads do. With trace = perf, the slow write-watch queries and freezes past the 200 lines they may log are counted and given every 60 frames, so a late area load still shows them; the session's lines had run out by frame 36,387. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 lines
2.1 KiB
C
28 lines
2.1 KiB
C
// The stutter map (NX2NAVI_STUTTER_MAP=1, stutter_map.c): for a play session, which frames hitched, in which area, what
|
|
// the frame waited for, and which pipelines and shaders draws met missing, so the next pipeline list and shader
|
|
// preparation can take them in.
|
|
#pragma once
|
|
#include <stdint.h>
|
|
|
|
extern int stutter_map_on; // set once at start (stutter_map_init); every hook below returns at once while it is 0
|
|
|
|
void stutter_map_init(void);
|
|
// An area's load (perf.c perf_scene, from romfs.c): hitches from here on are counted in that area, and those within
|
|
// SM_LOAD_NS of the load apart from play.
|
|
void stutter_area(const char *name);
|
|
// The texture pool began or ended making an area's textures (vk_exec_draw.c pool_loading): frames within SM_LOAD_NS of
|
|
// it count as an area load's too, in the area of the last stutter_area.
|
|
void stutter_load(void);
|
|
// A draw met its pipeline (shader 0) or one of its shaders (shader 1) missing and the replay thread spent ns on it
|
|
// before it was bound or skipped (vk_exec_draw.c, beside wait_note). vi, fi: the vertex (or mesh) and fragment shaders'
|
|
// input ids, NULL when not known (still translating, or no fragment stage).
|
|
void stutter_miss(int shader, int mesh, const uint8_t *vi, const uint8_t *fi, uint64_t ns, int skipped);
|
|
// A pipeline a draw missed became usable ms after the miss (vk_pipeline.c ready_note): recorded 1 when pipeline-keys.bin
|
|
// (or the seed list) named it, fresh 1 when one of its shaders was translated in this session (not prepared).
|
|
void stutter_ready(int mesh, const uint8_t *vi, const uint8_t *fi, double ms, int recorded, int fresh, int fast);
|
|
// Every present (perf.c ft_frame): d the frame's interval, part the time it went to by cause (names[i], n of them;
|
|
// the last one is the part nothing recorded explains), cause the one the frame is charged to.
|
|
void stutter_frame(uint64_t frame, uint64_t now, uint64_t d, const uint64_t *part, const char *const *names, int n,
|
|
int cause);
|
|
void stutter_report(const char *tag); // the map so far; every 5 minutes of play, at a focus loss in play and at exit
|