graph.cpp

main 95 lines · 3 KB Raw
Alex Alex Commit Client Upload Part 2 19/10/2026 00:06
1#include "graph.h"
2#include "painter.h"
3#include "textrender.h"
4#include "fontmanager.h"
5#include <framework/core/eventdispatcher.h>
6
7Graph g_graphs[GRAPH_LAST + 1] = {
8 {"Total frame time"},
9 {"CPU render time"},
10 {"GPU calls"},
11 {"GPU draws"},
12 {"Processing poll time"},
13 {"Graphics poll time"},
14 {"Dispatcher events"},
15 {"Graphics events"},
16 {"Latency"}
17};
18
19Graph::Graph(const std::string& name, size_t capacity) : m_name(name), m_capacity(capacity)
20{
21 if (capacity > MAX_CAPACITY)
22 g_logger.fatal(stdext::format("Max Graph capacity is %i, tried to create graph with capacity: %i", MAX_CAPACITY, capacity));
23}
24
25void Graph::draw(const Rect& dest)
26{
27 VALIDATE_GRAPHICS_THREAD();
28 static std::vector<float> vertices(MAX_CAPACITY * 2, 0); // max 512 lines
29 if (dest.width() < 50) return;
30 float offsetX = dest.left() + 2;
31 float offsetY = dest.top() + 17;
32 size_t elements = std::min<size_t>(m_values.size(), dest.width() / 2 - 2);
33
34 vertices[0] = dest.left();
35 vertices[1] = offsetY;
36 vertices[2] = dest.right();
37 vertices[3] = offsetY;
38 vertices[4] = dest.right();
39 vertices[5] = dest.bottom();
40 vertices[6] = dest.left();
41 vertices[7] = dest.bottom();
42 vertices[8] = dest.left();
43 vertices[9] = offsetY;
44
45 g_painter->drawLine(vertices, 5);
46 g_text.drawText(dest, m_name, g_fonts.getDefaultFont());
47
48 m_mutex.lock();
49 size_t start = m_values.size() - elements;
50 int minVal = 0xFFFFFF, maxVal = -0xFFFFFF;
51 for (size_t i = start; i < m_values.size(); ++i) {
52 if (minVal > m_values[i])
53 minVal = m_values[i];
54 if (maxVal < m_values[i])
55 maxVal = m_values[i];
56 }
57 // round
58 maxVal = (1 + maxVal / 10) * 10;
59 minVal = (minVal / 10) * 10;
60 float step = (float)(dest.height() - 21) / std::max<float>(1, (maxVal - minVal));
61 for (size_t i = start, j = 0; i < m_values.size(); ++i) {
62 vertices[j] = offsetX + j;
63 vertices[j + 1] = offsetY + 1 + (maxVal - m_values[i]) * step;
64 j += 2;
65 }
66 m_mutex.unlock();
67
68 if (elements > 0) {
69 g_text.drawText(dest, std::to_string(m_values.back()), g_fonts.getDefaultFont(), Color::white, Fw::AlignTopRight);
70 g_text.drawText(Rect(dest.left() + 1, offsetY, 50, 15), std::to_string(maxVal), g_fonts.getDefaultFont());
71 g_text.drawText(Rect(dest.left() + 1, dest.bottom() - 14, 50, 15), std::to_string(minVal), g_fonts.getDefaultFont());
72 }
73 g_painter->setColor(Color::white);
74 g_painter->drawLine(vertices, elements);
75}
76
77void Graph::clear()
78{
79 std::lock_guard<std::mutex> lock(m_mutex);
80 m_values.clear();
81}
82
83void Graph::addValue(int value, bool ignoreSmallValues)
84{
85 std::lock_guard<std::mutex> lock(m_mutex);
86 if (ignoreSmallValues) {
87 if (!m_values.empty() && m_values.back() <= 2 && value <= 2 && ++m_ignores <= 10)
88 return;
89 m_ignores = 0;
90 }
91 m_values.push_back(value);
92 if (m_values.size() > m_capacity)
93 m_values.pop_front();
94}
95
Top