Skip to content

Commit 9228006

Browse files
committed
Add Frame Time Display module
1 parent 6954c35 commit 9228006

File tree

7 files changed

+69
-0
lines changed

7 files changed

+69
-0
lines changed

LatiteRewrite.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@
432432
<ClInclude Include="src\client\feature\module\impl\hud\Chat.h" />
433433
<ClInclude Include="src\client\feature\module\impl\hud\ComboCounter.h" />
434434
<ClInclude Include="src\client\feature\module\impl\hud\CustomCoordinates.h" />
435+
<ClInclude Include="src\client\feature\module\impl\hud\FrameTimeDisplay.h" />
435436
<ClInclude Include="src\client\feature\module\impl\hud\ItemCounter.h" />
436437
<ClInclude Include="src\client\feature\module\impl\hud\MovableBossbar.h" />
437438
<ClInclude Include="src\client\feature\module\impl\hud\MovableCoordinates.h" />
@@ -737,6 +738,7 @@
737738
<ClCompile Include="deps\mnem\scan\scanner.cpp" />
738739
<ClCompile Include="deps\mnem\scan\scanner_avx2.cpp" />
739740
<ClCompile Include="src\client\feature\module\impl\game\AutoGG.cpp" />
741+
<ClCompile Include="src\client\feature\module\impl\hud\FrameTimeDisplay.cpp" />
740742
<ClCompile Include="src\client\feature\module\impl\visual\NoHurtCam.cpp" />
741743
<ClCompile Include="src\client\feature\module\impl\game\EnvironmentChanger.cpp" />
742744
<ClCompile Include="src\client\feature\module\impl\game\Freelook.cpp" />

LatiteRewrite.vcxproj.filters

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@
162162
<ClCompile Include="src\client\feature\module\impl\hud\TabList.cpp" />
163163
<ClCompile Include="src\client\script\objects\OSScriptingObject.cpp" />
164164
<ClCompile Include="src\client\feature\module\impl\game\AutoGG.cpp" />
165+
<ClCompile Include="src\client\feature\module\impl\hud\FrameTimeDisplay.cpp" />
165166
</ItemGroup>
166167
<ItemGroup>
167168
<ClInclude Include="assets\lang\en_US.json" />
@@ -481,6 +482,7 @@
481482
<ClInclude Include="assets\lang\zh_CN.json" />
482483
<ClInclude Include="assets\lang\zh_TW.json" />
483484
<ClInclude Include="src\client\script\objects\OSScriptingObject.h" />
485+
<ClInclude Include="src\client\feature\module\impl\hud\FrameTimeDisplay.h" />
484486
</ItemGroup>
485487
<ItemGroup>
486488
<ResourceCompile Include="LatiteRewrite.rc" />

src/client/feature/module/ModuleManager.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "impl/hud/ComboCounter.h"
5050
#include "impl/hud/CustomCoordinates.h"
5151
#include "impl/hud/MovableCoordinates.h"
52+
#include "impl/hud/FrameTimeDisplay.h"
5253

5354
#include "client/event/impl/KeyUpdateEvent.h"
5455

@@ -97,6 +98,7 @@ ModuleManager::ModuleManager() {
9798
this->items.push_back(std::make_shared<MovableCoordinates>());
9899
this->items.push_back(std::make_shared<NoHurtCam>());
99100
this->items.push_back(std::make_shared<AutoGG>());
101+
this->items.push_back(std::make_shared<FrameTimeDisplay>());
100102

101103
for (auto& mod : items) {
102104
mod->onInit();
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "pch.h"
2+
#include "FrameTimeDisplay.h"
3+
#include "client/Latite.h"
4+
5+
// TODO: Make this module translatable
6+
FrameTimeDisplay::FrameTimeDisplay() : TextModule("FrameTimeDisplay", L"Frame Time Display",
7+
L"Displays the time it takes to render and display a frame (in milliseconds)",
8+
HUD, 400.f, 0, true) {
9+
10+
addSliderSetting("interval", L"Interval",
11+
L"The amount of time it takes to update the display (in milliseconds)", interval, FloatValue(0.f),
12+
FloatValue(1000.f), FloatValue(100.f));
13+
this->prefix = TextValue(L"Frame time: ");
14+
this->suffix = TextValue(L"ms");
15+
}
16+
17+
std::wstringstream FrameTimeDisplay::text(bool isDefault, bool inEditor) {
18+
// normal caching in the TextModule constructor didnt work so im doing this
19+
static std::wstring cachedText;
20+
static std::chrono::steady_clock::time_point lastUpdate;
21+
static float displayedValue = -1.0f;
22+
23+
const float currentValue = Latite::get().getTimings().getFrameTime();
24+
const std::chrono::time_point<std::chrono::steady_clock> now = std::chrono::steady_clock::now();
25+
const long long elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - lastUpdate).count();
26+
27+
if (elapsed >= std::get<FloatValue>(interval)) {
28+
std::wstringstream ss;
29+
ss << std::fixed << std::setprecision(1) << currentValue;
30+
cachedText = ss.str();
31+
displayedValue = currentValue;
32+
lastUpdate = now;
33+
}
34+
35+
std::wstringstream output;
36+
if (!cachedText.empty()) {
37+
output.str(cachedText);
38+
output.clear();
39+
}
40+
return output;
41+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#pragma once
2+
#include "../../TextModule.h"
3+
4+
class FrameTimeDisplay : public TextModule {
5+
public:
6+
FrameTimeDisplay();
7+
8+
std::wstringstream text(bool isDefault, bool inEditor) override;
9+
private:
10+
ValueType interval = FloatValue(100.f);
11+
};

src/client/misc/Timings.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ int Timings::getPerSecond(std::vector<std::chrono::steady_clock::time_point>& li
1717

1818
void Timings::update()
1919
{
20+
std::chrono::time_point<std::chrono::steady_clock> now = std::chrono::high_resolution_clock::now();
21+
22+
auto currentFrameDuration = now - lastFrameTime;
23+
frameTime = std::chrono::duration<float, std::milli>(currentFrameDuration).count();
24+
lastFrameTime = now;
25+
2026
auto dur = std::chrono::high_resolution_clock::now() - lastFPSTime;
2127
float dir = std::chrono::duration<float, std::milli>(dur).count();
2228
if (dir > 1000) {

src/client/misc/Timings.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ class Timings final
1818
[[nodiscard]] int getFPS() { return fps; }
1919
[[nodiscard]] int getCPSL() { return cpsL; }
2020
[[nodiscard]] int getCPSR() { return cpsR; }
21+
[[nodiscard]] float getFrameTime() { return frameTime; }
2122
private:
2223

2324
std::chrono::steady_clock::time_point beginTime{};
25+
std::chrono::high_resolution_clock::time_point lastFrameTimeUpdate;
2426
float injectTime = 0.f;
2527

2628
int cpsL = 0;
@@ -29,6 +31,9 @@ class Timings final
2931
int fps = 0;
3032
float tps = 0;
3133

34+
std::chrono::high_resolution_clock::time_point lastFrameTime;
35+
float frameTime = 0.0f;
36+
3237
std::vector<std::chrono::steady_clock::time_point> cpsLV;
3338
std::vector<std::chrono::steady_clock::time_point> cpsRV;
3439
std::vector<std::chrono::steady_clock::time_point> tpsV;

0 commit comments

Comments
 (0)