add tracking of garbage collections

This commit is contained in:
John Alanbrook 2024-09-24 17:07:32 -05:00
parent 0666f4d949
commit ad1bcd45c7
4 changed files with 72 additions and 37 deletions

View file

@ -339,16 +339,28 @@ function printreport(cache, name) {
}; };
profile.data = {}; profile.data = {};
profile.data.cpu = {}; profile.data.cpu = {
scripts: [],
render: [],
physics: [],
};
profile.data.gpu = {}; profile.data.gpu = {};
profile.data.physics = {}; profile.data.physics = {};
profile.data.script = {}; profile.data.script = {};
profile.data.memory = {};
var frame = 0; var frame = 0;
profile.pushdata = function(arr, val)
{
if (arr.last() !== val)
arr[frame] = val;
}
profile.capture_data = function() profile.capture_data = function()
{ {
var mem = os.mem(); var mem = os.mem();
var memo = profile.data.script; var memo = profile.data.memory;
for (var i in mem) { for (var i in mem) {
memo[i] ??= []; memo[i] ??= [];
if (memo[i].last() !== mem[i]) if (memo[i].last() !== mem[i])
@ -365,19 +377,6 @@ profile.best_mem = function(bytes)
return (bytes / Math.pow(1024, i)).toPrecision(3) + ' ' + sizes[i]; return (bytes / Math.pow(1024, i)).toPrecision(3) + ' ' + sizes[i];
} }
profile.print_mem = function()
{
var mem = os.mem();
say('total memory used: ' + profile.best_mem(mem.memory_used_size));
say('total malloced: ' + profile.best_mem(mem.malloc_size));
delete mem.memory_used_size;
delete mem.malloc_size;
for (var i in mem) {
if (i. includes("size"))
say(" " + i + " :: " + profile.best_mem(mem[i]));
}
}
profile.last_mem = undefined; profile.last_mem = undefined;
profile.mems = []; profile.mems = [];
profile.gcs = []; profile.gcs = [];
@ -385,13 +384,8 @@ profile.print_gc = function()
{ {
var gc = os.check_gc(); var gc = os.check_gc();
if (!gc) return; if (!gc) return;
profile.gcs.push(gc); profile.data.gc ??= [];
profile.mems.push(os.mem()); profile.data.gc[frame] = gc;
say("GC Hit");
say (`time: ${profile.best_t(gc.time)}`);
say(`new threshold: ${profile.best_mem(profile.mems.last().gc_threshold)}`);
say(`memory checked: ${profile.best_mem(profile.gcs.last().mem)}`);
say(`memory freed: ${profile.best_mem(profile.gcs.last().startmem - profile.gcs.last().mem)}`);
} }
return {profile}; return {profile};

View file

@ -1189,12 +1189,16 @@ prosperon.process = function process() {
var dt = profile.secs(profile.now()) - frame_t; var dt = profile.secs(profile.now()) - frame_t;
frame_t = profile.secs(profile.now()); frame_t = profile.secs(profile.now());
var sst = profile.now();
/* debugging: check for gc */ /* debugging: check for gc */
profile.print_gc(); profile.print_gc();
var cycles = os.check_cycles(); var cycles = os.check_cycles();
if (cycles) say(cycles); if (cycles) say(cycles);
profile.frame("app update"); profile.frame("app update");
prosperon.appupdate(dt); prosperon.appupdate(dt);
profile.endframe(); profile.endframe();
@ -1209,7 +1213,12 @@ prosperon.process = function process() {
update_emitters(dt * game.timescale); update_emitters(dt * game.timescale);
profile.endframe(); profile.endframe();
if (sim.mode === "step") sim.pause(); if (sim.mode === "step") sim.pause();
}
profile.pushdata(profile.data.cpu.scripts, profile.now()-sst);
sst = profile.now();
if (sim.mode === "play" || sim.mode === "step") {
profile.frame("physics"); profile.frame("physics");
physlag += dt; physlag += dt;
@ -1219,11 +1228,14 @@ prosperon.process = function process() {
prosperon.physupdate(physics.delta * game.timescale); prosperon.physupdate(physics.delta * game.timescale);
} }
profile.endframe(); profile.endframe();
profile.pushdata(profile.data.cpu.physics, profile.now()-sst);
sst = profile.now();
} }
profile.frame("render"); profile.frame("render");
prosperon.window_render(window.size); prosperon.window_render(window.size);
prosperon.render(); prosperon.render();
profile.pushdata(profile.data.cpu.render, profile.now()-sst);
profile.endframe(); profile.endframe();
profile.endframe(); profile.endframe();

View file

@ -64,17 +64,20 @@ JSC_CCALL(imgui_menuitem,
) )
JSC_SCALL(imgui_plot, JSC_SCALL(imgui_plot,
ImPlot::BeginPlot(str); if (ImPlot::BeginPlot(str)) {
script_call_sym(argv[1], 0, NULL); script_call_sym(argv[1], 0, NULL);
ImPlot::EndPlot(); ImPlot::EndPlot();
}
) )
#define PLOT_FN(NAME, FN, ADD) JSC_SCALL(imgui_##NAME, \ #define PLOT_FN(NAME, FN, ADD, SHADED) JSC_SCALL(imgui_##NAME, \
fill_plotdata(argv[1]); \ fill_plotdata(argv[1]); \
ImPlot::FN(str, &plotdata[0].x, &plotdata[0].y, arrlen(plotdata), ADD 0, 0, sizeof(HMM_Vec2)); \ bool shaded = js2boolean(argv[2]);\
int flag = 0; \
if (shaded) flag = SHADED; \
ImPlot::FN(str, &plotdata[0].x, &plotdata[0].y, arrlen(plotdata), ADD flag, 0, sizeof(HMM_Vec2)); \
) \ ) \
static HMM_Vec2 *plotdata = NULL; static HMM_Vec2 *plotdata = NULL;
void fill_plotdata(JSValue v) void fill_plotdata(JSValue v)
@ -95,10 +98,24 @@ void fill_plotdata(JSValue v)
} }
} }
PLOT_FN(lineplot, PlotLine,) PLOT_FN(lineplot, PlotLine,,ImPlotLineFlags_Shaded)
PLOT_FN(scatterplot, PlotScatter,) PLOT_FN(scatterplot, PlotScatter,,0)
PLOT_FN(stairplot, PlotStairs,) PLOT_FN(stairplot, PlotStairs,,ImPlotStairsFlags_Shaded)
PLOT_FN(digitalplot, PlotDigital,) PLOT_FN(digitalplot, PlotDigital,,0)
static HMM_Vec3 *shadedata = NULL;
JSC_SCALL(imgui_shadedplot,
arrsetlen(plotdata,js_arrlen(argv[1]));
for (int i = 0; i < js_arrlen(argv[1]); i++) {
HMM_Vec3 c;
c.x = i;
c.y = js2number(js_getpropidx(argv[1],i));
c.z = js2number(js_getpropidx(argv[2],i));
arrput(shadedata, c);
}
ImPlot::PlotShaded(str, &shadedata[0].x, &shadedata[0].y, &shadedata[0].z, arrlen(shadedata), 0, 0, sizeof(HMM_Vec3));
)
JSC_SCALL(imgui_barplot, JSC_SCALL(imgui_barplot,
fill_plotdata(argv[1]); fill_plotdata(argv[1]);
ImPlot::PlotBars(str, &plotdata[0].x, &plotdata[0].y, js_arrlen(argv[1]), js2number(argv[2]), 0, 0, sizeof(HMM_Vec2)); ImPlot::PlotBars(str, &plotdata[0].x, &plotdata[0].y, js_arrlen(argv[1]), js2number(argv[2]), 0, 0, sizeof(HMM_Vec2));
@ -143,6 +160,15 @@ JSC_SCALL(imgui_textplot,
ImPlot::PlotText(str, v.x, v.y); ImPlot::PlotText(str, v.x, v.y);
) )
JSC_CCALL(imgui_inplot,
HMM_Vec2 v = js2vec2(argv[0]);
ImPlotRect lm = ImPlot::GetPlotLimits();
if (v.x > lm.X.Min && v.x < lm.X.Max && v.y > lm.Y.Min && v.y < lm.Y.Max)
return boolean2js(true);
return boolean2js(false);
)
JSC_CCALL(imgui_plothovered, JSC_CCALL(imgui_plothovered,
return boolean2js(ImPlot::IsPlotHovered()); return boolean2js(ImPlot::IsPlotHovered());
) )
@ -735,6 +761,7 @@ static const JSCFunctionListEntry js_imgui_funcs[] = {
MIST_FUNC_DEF(imgui, plot2pixels, 1), MIST_FUNC_DEF(imgui, plot2pixels, 1),
MIST_FUNC_DEF(imgui, plotpos, 0), MIST_FUNC_DEF(imgui, plotpos, 0),
MIST_FUNC_DEF(imgui, plotlimits, 0), MIST_FUNC_DEF(imgui, plotlimits, 0),
MIST_FUNC_DEF(imgui, inplot, 1),
MIST_FUNC_DEF(imgui, window, 2), MIST_FUNC_DEF(imgui, window, 2),
MIST_FUNC_DEF(imgui, menu, 2), MIST_FUNC_DEF(imgui, menu, 2),
MIST_FUNC_DEF(imgui, sameline, 1), MIST_FUNC_DEF(imgui, sameline, 1),
@ -755,9 +782,11 @@ static const JSCFunctionListEntry js_imgui_funcs[] = {
MIST_FUNC_DEF(imgui, checkbox, 2), MIST_FUNC_DEF(imgui, checkbox, 2),
MIST_FUNC_DEF(imgui, text, 1), MIST_FUNC_DEF(imgui, text, 1),
MIST_FUNC_DEF(imgui, plot, 1), MIST_FUNC_DEF(imgui, plot, 1),
MIST_FUNC_DEF(imgui, lineplot, 2), MIST_FUNC_DEF(imgui, lineplot, 3),
MIST_FUNC_DEF(imgui, scatterplot, 2), MIST_FUNC_DEF(imgui, scatterplot, 3),
MIST_FUNC_DEF(imgui, stairplot, 2), MIST_FUNC_DEF(imgui, stairplot, 3),
MIST_FUNC_DEF(imgui, digitalplot, 3),
MIST_FUNC_DEF(imgui, shadedplot, 3),
MIST_FUNC_DEF(imgui, barplot, 3), MIST_FUNC_DEF(imgui, barplot, 3),
MIST_FUNC_DEF(imgui, pieplot, 5), MIST_FUNC_DEF(imgui, pieplot, 5),
MIST_FUNC_DEF(imgui, textplot, 2), MIST_FUNC_DEF(imgui, textplot, 2),
@ -822,7 +851,7 @@ static int started = 0;
JSValue gui_init(JSContext *js) JSValue gui_init(JSContext *js)
{ {
simgui_desc_t sdesc = {0}; simgui_desc_t sdesc = {};
simgui_setup(&sdesc); simgui_setup(&sdesc);
sgimgui_desc_t desc = {0}; sgimgui_desc_t desc = {0};

View file

@ -111,7 +111,7 @@
// Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices). // Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices).
// Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer. // Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer.
// Read about ImGuiBackendFlags_RendererHasVtxOffset for details. // Read about ImGuiBackendFlags_RendererHasVtxOffset for details.
// #define ImDrawIdx unsigned int //#define ImDrawIdx unsigned int
//---- Override ImDrawCallback signature (will need to modify renderer backends accordingly) //---- Override ImDrawCallback signature (will need to modify renderer backends accordingly)
//struct ImDrawList; //struct ImDrawList;