1
0
forked from 0ad/0ad
0ad/source/tools/replayprofile/graph.js
wraitii 5e5ea5cba5 Fix replayprofile/ graphing tool for Profiler1
All modern browsers block ajax request to local file.
This changes extract.pl to generate a single HTML file with data
embedded.
This is now the default behaviour, --to-json to export, --from-json to
load exported.

Patch by: nwtour
Reviewed By: wraitii
Differential Revision: https://code.wildfiregames.com/D3621
This was SVN commit r24975.
2021-03-02 08:35:39 +00:00

146 lines
3.0 KiB
JavaScript

/**
* Contents of data.json
*/
var replayData;
/**
* Number of turns between two saved profiler snapshots.
* Keep in sync with Replay.cpp.
*/
var PROFILE_TURN_INTERVAL = 20;
/**
* These columns are never displayed.
*/
var filteredColumns = [
"sim update", // indistringuishable from Total
"unlogged" // Bogus
];
/**
* Determines how the the different graphs are formatted.
*/
var graphFormat = {
"time": {
"axisTitle": "Time per frame",
"unit": "milliseconds",
"digits": 2,
"scale": 1,
},
"bytes": {
"axisTitle": "Memory",
"unit": "Megabytes",
"digits": 2,
"scale": 1 / 1024 / 1024,
"isColumn": function(label) {
return label.indexOf("bytes") != -1;
}
},
"garbageCollection": {
"axisTitle": "Number of Garbace Collections",
"unit": "",
"scale": 1,
"digits": 0,
"isColumn": function(label) {
return label == "number of GCs";
}
}
};
function showReplayData()
{
loadReplayGraphData();
var displayedColumn = $("#replayGraphSelection").val();
$.plot($("#replayGraph"), getReplayGraphData(displayedColumn), {
"grid": {
"hoverable": true
},
"zoom": {
"interactive": true
},
"pan": {
"interactive": true
},
"legend": {
"container": $("#replayGraphLegend")
}
});
$("#replayGraph").bind("plothover", function (event, pos, item) {
$("#tooltip").remove();
if (!item)
return;
showTooltip(
item.pageX,
item.pageY,
displayedColumn,
item.series.label,
item.datapoint[0],
item.datapoint[1].toFixed(graphFormat[displayedColumn].digits));
});
$("#replayGraphDescription").html(
"<p>X axis: Turn Number</p>" +
"<p>Y axis: " + graphFormat[displayedColumn].axisTitle +
(graphFormat[displayedColumn].unit ? " [" + graphFormat[displayedColumn].unit + "]" : "") + "</p>" +
"<p>Drag to pan, mouse-wheel to zoom</p>"
);
}
/**
* Filter the affected columns and apply the scaling and rounding.
*/
function getReplayGraphData(displayedColumn)
{
var replayGraphData = [];
for (var i = 0; i < replayData.length; ++i)
{
var label = replayData[i].label;
if (filteredColumns.indexOf(label) != -1 ||
(displayedColumn == "bytes") != graphFormat.bytes.isColumn(label) ||
(displayedColumn == "garbageCollection") != (graphFormat.garbageCollection.isColumn(label)))
continue
var data = [];
for (var j = 0; j < replayData[i].data.length; ++j)
data.push([
replayData[i].data[j][0] * PROFILE_TURN_INTERVAL,
replayData[i].data[j][1] * graphFormat[displayedColumn].scale
]);
replayGraphData.push({
"label": label,
"data": data
});
}
return replayGraphData;
}
function showTooltip(x, y, displayedColumn, label, turn, value)
{
$("body").append(
$('<div id="tooltip">' + label + " at turn " + turn + ": " + value + " " + graphFormat[displayedColumn].unit + "</div>").css({
"position": "absolute",
"top": y + 5,
"left": x + 5,
"border": "1px solid #fdd",
"padding": "2px",
"background-color": "#fee",
"opacity": 0.8
}));
}
function loadReplayGraphData()
{
replayData =
<!-- include data json -->
}
$(loadReplayGraphData);