Skip to content

Commit f70857e

Browse files
committed
feature/fps-1percent-low-hud
1 parent c13e363 commit f70857e

11 files changed

Lines changed: 219 additions & 32 deletions

File tree

Core/GameEngine/Include/GameClient/Display.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ class Display : public SubsystemInterface
184184
virtual void setCinematicTextFrames( Int frames ) { m_cinematicTextFrames = frames; }
185185

186186
virtual Real getAverageFPS() = 0; ///< returns the average FPS.
187+
virtual Real getLow1PercentFPS() = 0; ///< returns the 1% low FPS.
187188
virtual Real getCurrentFPS() = 0; ///< returns the current FPS.
188189
virtual Int getLastFrameDrawCalls() = 0; ///< returns the number of draw calls issued in the previous frame
189190

Generals/Code/GameEngine/Include/GameClient/InGameUI.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,16 +747,19 @@ friend class Drawable; // for selection/deselection transactions
747747

748748
// Render FPS Counter
749749
DisplayString * m_renderFpsString;
750+
DisplayString * m_renderFpsLowString;
750751
DisplayString * m_renderFpsLimitString;
751752
AsciiString m_renderFpsFont;
752753
Int m_renderFpsPointSize;
753754
Bool m_renderFpsBold;
754755
Coord2D m_renderFpsPosition;
755756
Color m_renderFpsColor;
757+
Color m_renderFpsLowColor;
756758
Color m_renderFpsLimitColor;
757759
Color m_renderFpsDropColor;
758760
UnsignedInt m_renderFpsRefreshMs;
759761
UnsignedInt m_lastRenderFps;
762+
UnsignedInt m_lastRenderFpsLow;
760763
UnsignedInt m_lastRenderFpsLimit;
761764
UnsignedInt m_lastRenderFpsUpdateMs;
762765

Generals/Code/GameEngine/Source/GameClient/InGameUI.cpp

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,7 @@ const FieldParse InGameUI::s_fieldParseTable[] =
888888
{ "RenderFpsBold", INI::parseBool, nullptr, offsetof( InGameUI, m_renderFpsBold ) },
889889
{ "RenderFpsPosition", INI::parseCoord2D, nullptr, offsetof( InGameUI, m_renderFpsPosition ) },
890890
{ "RenderFpsColor", INI::parseColorInt, nullptr, offsetof( InGameUI, m_renderFpsColor ) },
891+
{ "RenderFpsLowColor", INI::parseColorInt, nullptr, offsetof( InGameUI, m_renderFpsLowColor ) },
891892
{ "RenderFpsLimitColor", INI::parseColorInt, nullptr, offsetof( InGameUI, m_renderFpsLimitColor ) },
892893
{ "RenderFpsDropColor", INI::parseColorInt, nullptr, offsetof( InGameUI, m_renderFpsDropColor ) },
893894
{ "RenderFpsRefreshMs", INI::parseUnsignedInt, nullptr, offsetof( InGameUI, m_renderFpsRefreshMs ) },
@@ -1133,17 +1134,20 @@ InGameUI::InGameUI()
11331134
m_lastNetworkLatencyFrames = ~0u;
11341135

11351136
m_renderFpsString = nullptr;
1137+
m_renderFpsLowString = nullptr;
11361138
m_renderFpsLimitString = nullptr;
11371139
m_renderFpsFont = "Tahoma";
11381140
m_renderFpsPointSize = TheGlobalData->m_renderFpsFontSize;
11391141
m_renderFpsBold = TRUE;
11401142
m_renderFpsPosition.x = kHudAnchorX;
11411143
m_renderFpsPosition.y = kHudAnchorY;
11421144
m_renderFpsColor = GameMakeColor( 255, 255, 0, 255 );
1145+
m_renderFpsLowColor = GameMakeColor( 180, 170, 120, 255 );
11431146
m_renderFpsLimitColor = GameMakeColor(119, 119, 119, 255);
11441147
m_renderFpsDropColor = GameMakeColor( 0, 0, 0, 255 );
11451148
m_renderFpsRefreshMs = 1000;
11461149
m_lastRenderFps = ~0u;
1150+
m_lastRenderFpsLow = ~0u;
11471151
m_lastRenderFpsLimit = ~0u;
11481152
m_lastRenderFpsUpdateMs = 0u;
11491153

@@ -2215,6 +2219,8 @@ void InGameUI::freeCustomUiResources()
22152219
m_networkLatencyString = nullptr;
22162220
TheDisplayStringManager->freeDisplayString(m_renderFpsString);
22172221
m_renderFpsString = nullptr;
2222+
TheDisplayStringManager->freeDisplayString(m_renderFpsLowString);
2223+
m_renderFpsLowString = nullptr;
22182224
TheDisplayStringManager->freeDisplayString(m_renderFpsLimitString);
22192225
m_renderFpsLimitString = nullptr;
22202226
TheDisplayStringManager->freeDisplayString(m_systemTimeString);
@@ -5868,6 +5874,12 @@ void InGameUI::refreshRenderFpsResources()
58685874
m_lastRenderFpsUpdateMs = 0u;
58695875
}
58705876

5877+
if (!m_renderFpsLowString)
5878+
{
5879+
m_renderFpsLowString = TheDisplayStringManager->newDisplayString();
5880+
m_lastRenderFpsLow = ~0u;
5881+
}
5882+
58715883
if (!m_renderFpsLimitString)
58725884
{
58735885
m_renderFpsLimitString = TheDisplayStringManager->newDisplayString();
@@ -5878,6 +5890,7 @@ void InGameUI::refreshRenderFpsResources()
58785890
Int adjustedRenderFpsFontSize = TheGlobalLanguageData->adjustFontSize(m_renderFpsPointSize);
58795891
GameFont *fpsFont = TheWindowManager->winFindFont(m_renderFpsFont, adjustedRenderFpsFontSize, m_renderFpsBold);
58805892
m_renderFpsString->setFont(fpsFont);
5893+
m_renderFpsLowString->setFont(fpsFont);
58815894
m_renderFpsLimitString->setFont(fpsFont);
58825895

58835896
if (m_renderFpsPointSize > 0)
@@ -5990,6 +6003,15 @@ void InGameUI::updateRenderFpsString()
59906003
m_renderFpsString->setText(fpsStr);
59916004
m_lastRenderFps = renderFps;
59926005
}
6006+
6007+
const UnsignedInt renderFpsLow = (UnsignedInt)(TheDisplay->getLow1PercentFPS() + 0.5f);
6008+
if (renderFpsLow != m_lastRenderFpsLow)
6009+
{
6010+
UnicodeString lowStr;
6011+
lowStr.format(L"(%u)", renderFpsLow);
6012+
m_renderFpsLowString->setText(lowStr);
6013+
m_lastRenderFpsLow = renderFpsLow;
6014+
}
59936015
}
59946016

59956017
void InGameUI::drawNetworkLatency(Int &x, Int &y)
@@ -6056,14 +6078,20 @@ void InGameUI::drawRenderFps(Int &x, Int &y)
60566078
const Int drawY = kHudAnchorY + y;
60576079

60586080
m_renderFpsString->draw(kHudAnchorX + x, drawY, m_renderFpsColor, m_renderFpsDropColor);
6059-
x += m_renderFpsString->getWidth();
6081+
x += m_renderFpsString->getWidth() + kHudGapPx / 2;
6082+
m_renderFpsLowString->draw(kHudAnchorX + x, drawY, m_renderFpsLowColor, m_renderFpsDropColor);
6083+
x += m_renderFpsLowString->getWidth() + kHudGapPx / 2;
60606084
m_renderFpsLimitString->draw(kHudAnchorX + x, drawY, m_renderFpsLimitColor, m_renderFpsDropColor);
60616085
x += m_renderFpsLimitString->getWidth() + kHudGapPx;
60626086
}
60636087
else
60646088
{
6065-
m_renderFpsString->draw(m_renderFpsPosition.x, m_renderFpsPosition.y, m_renderFpsColor, m_renderFpsDropColor);
6066-
m_renderFpsLimitString->draw(m_renderFpsPosition.x + m_renderFpsString->getWidth(), m_renderFpsPosition.y, m_renderFpsLimitColor, m_renderFpsDropColor);
6089+
Int currentX = m_renderFpsPosition.x;
6090+
m_renderFpsString->draw(currentX, m_renderFpsPosition.y, m_renderFpsColor, m_renderFpsDropColor);
6091+
currentX += m_renderFpsString->getWidth() + kHudGapPx / 2;
6092+
m_renderFpsLowString->draw(currentX, m_renderFpsPosition.y, m_renderFpsLowColor, m_renderFpsDropColor);
6093+
currentX += m_renderFpsLowString->getWidth() + kHudGapPx / 2;
6094+
m_renderFpsLimitString->draw(currentX, m_renderFpsPosition.y, m_renderFpsLimitColor, m_renderFpsDropColor);
60676095
}
60686096
}
60696097

Generals/Code/GameEngineDevice/Include/W3DDevice/GameClient/W3DDisplay.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ class W3DDisplay : public Display
148148

149149
void drawFPSStats(); ///< draw the fps on the screen
150150
virtual Real getAverageFPS() override; ///< return the average FPS.
151+
virtual Real getLow1PercentFPS() override; ///< return the 1% low FPS.
151152
virtual Real getCurrentFPS() override; ///< return the current FPS.
152153
virtual Int getLastFrameDrawCalls() override; ///< returns the number of draw calls issued in the previous frame
153154

@@ -161,7 +162,7 @@ class W3DDisplay : public Display
161162
void drawCurrentDebugDisplay(); ///< draws current debug display
162163
void calculateTerrainLOD(); ///< Calculate terrain LOD.
163164
void renderLetterBox(UnsignedInt time); ///< draw letter box border
164-
void updateAverageFPS(); ///< calculate the average fps over the last 30 frames.
165+
void updateAverageFPS(); ///< calculate the average and 1% low fps over time windows (0.5s and 3.0s).
165166
void setup2DRenderState(TextureClass *tex, DrawImageMode mode, Bool grayscale);
166167
virtual void onBeginBatch() override;
167168
virtual void onEndBatch() override;
@@ -172,7 +173,8 @@ class W3DDisplay : public Display
172173
Render2DClass *m_2DRender; ///< interface for common 2D functions
173174
IRegion2D m_clipRegion; ///< the clipping region for images
174175
Bool m_isClippedEnabled; ///<used by 2D drawing operations to define clip re
175-
Real m_averageFPS; ///<average fps over the last 30 frames.
176+
Real m_averageFPS; ///< average fps over the last 0.5s.
177+
Real m_low1PercentFPS; ///<1% low fps.
176178
Real m_currentFPS; ///<current fps value.
177179

178180
TextureClass *m_batchTexture;

Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp

Lines changed: 70 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ W3DDisplay::W3DDisplay()
340340
m_2DScene = nullptr;
341341
m_3DInterfaceScene = nullptr;
342342
m_averageFPS = TheGlobalData->m_framesPerSecondLimit;
343+
m_low1PercentFPS = TheGlobalData->m_framesPerSecondLimit;
343344
#if defined(RTS_DEBUG)
344345
m_timerAtCumuFPSStart = 0;
345346
#endif
@@ -960,11 +961,12 @@ const UnsignedInt START_CUMU_FRAME = LOGICFRAMES_PER_SECOND / 2; // skip first h
960961

961962
void W3DDisplay::updateAverageFPS()
962963
{
963-
constexpr const Int FPS_HISTORY_SIZE = 30;
964-
965-
static Int64 lastUpdateTime64 = 0;
966-
static Int historyOffset = 0;
964+
constexpr const Int FPS_HISTORY_SIZE = 1000;
967965
static Real fpsHistory[FPS_HISTORY_SIZE] = {0};
966+
static Real durationHistory[FPS_HISTORY_SIZE] = {0};
967+
static Int historyOffset = 0;
968+
static Int historyCount = 0;
969+
static Int64 lastUpdateTime64 = 0;
968970

969971
const Int64 freq64 = getPerformanceCounterFrequency();
970972
const Int64 time64 = getPerformanceCounter();
@@ -976,21 +978,73 @@ void W3DDisplay::updateAverageFPS()
976978
}
977979
#endif
978980

981+
if (lastUpdateTime64 == 0)
982+
{
983+
lastUpdateTime64 = time64;
984+
return;
985+
}
986+
979987
const Int64 timeDiff = time64 - lastUpdateTime64;
980988

981989
// convert elapsed time to seconds
982990
Real elapsedSeconds = (Real)timeDiff/(Real)freq64;
983991

984992
// append new sample to fps history.
985-
if (historyOffset >= FPS_HISTORY_SIZE)
986-
historyOffset = 0;
993+
if (elapsedSeconds > 0)
994+
{
995+
m_currentFPS = 1.0f/elapsedSeconds;
996+
fpsHistory[historyOffset] = m_currentFPS;
997+
durationHistory[historyOffset] = elapsedSeconds;
998+
historyOffset = (historyOffset + 1) % FPS_HISTORY_SIZE;
999+
if (historyCount < FPS_HISTORY_SIZE) historyCount++;
1000+
}
1001+
1002+
// determine average frame rate over the last 0.5 seconds and 1% low over 3.0 seconds.
1003+
if (historyCount > 0)
1004+
{
1005+
Real timeSum = 0;
1006+
Real fpsSum = 0;
1007+
Int avgSamples = 0;
1008+
Int lowSamples = 0;
1009+
Bool avgDone = FALSE;
9871010

988-
m_currentFPS = 1.0f/elapsedSeconds;
989-
fpsHistory[historyOffset++] = m_currentFPS;
1011+
for (Int i = 0; i < historyCount; ++i)
1012+
{
1013+
Int idx = (historyOffset - 1 - i + FPS_HISTORY_SIZE) % FPS_HISTORY_SIZE;
1014+
timeSum += durationHistory[idx];
1015+
1016+
lowSamples++;
1017+
1018+
if (!avgDone)
1019+
{
1020+
fpsSum += fpsHistory[idx];
1021+
avgSamples++;
1022+
if (timeSum >= 0.5f) avgDone = TRUE;
1023+
}
1024+
1025+
if (timeSum >= 3.0f) break;
1026+
}
9901027

991-
// determine average frame rate over our past history.
992-
const Real sum = std::accumulate(fpsHistory, fpsHistory + FPS_HISTORY_SIZE, 0.0f);
993-
m_averageFPS = sum / FPS_HISTORY_SIZE;
1028+
m_averageFPS = avgSamples > 0 ? fpsSum / (Real)avgSamples : m_currentFPS;
1029+
1030+
// TheSuperHackers @feature One percent low FPS calculation (last 3.0 seconds)
1031+
// Throttle sorting to 1000ms intervals to match HUD refresh and save CPU
1032+
static UnsignedInt lastLowUpdate = 0;
1033+
UnsignedInt now = timeGetTime();
1034+
if (now - lastLowUpdate >= 1000)
1035+
{
1036+
lastLowUpdate = now;
1037+
static Real sortBuffer[FPS_HISTORY_SIZE];
1038+
for (Int i = 0; i < lowSamples; ++i)
1039+
{
1040+
Int idx = (historyOffset - 1 - i + FPS_HISTORY_SIZE) % FPS_HISTORY_SIZE;
1041+
sortBuffer[i] = fpsHistory[idx];
1042+
}
1043+
const Int lowCount = std::max(lowSamples / 100, 1);
1044+
std::nth_element(sortBuffer, sortBuffer + lowCount, sortBuffer + lowSamples);
1045+
m_low1PercentFPS = std::accumulate(sortBuffer, sortBuffer + lowCount, 0.0f) / (Real)lowCount;
1046+
}
1047+
}
9941048

9951049
lastUpdateTime64 = time64;
9961050
}
@@ -1693,6 +1747,11 @@ Real W3DDisplay::getAverageFPS()
16931747
return m_averageFPS;
16941748
}
16951749

1750+
Real W3DDisplay::getLow1PercentFPS()
1751+
{
1752+
return m_low1PercentFPS;
1753+
}
1754+
16961755
Real W3DDisplay::getCurrentFPS()
16971756
{
16981757
return m_currentFPS;

Generals/Code/Tools/GUIEdit/Include/GUIEditDisplay.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ class GUIEditDisplay : public Display
124124
#endif
125125

126126
virtual Real getAverageFPS() override { return 0; }
127+
virtual Real getLow1PercentFPS() override { return 0; }
127128
virtual Real getCurrentFPS() override { return 0; }
128129
virtual Int getLastFrameDrawCalls() override { return 0; }
129130

GeneralsMD/Code/GameEngine/Include/GameClient/InGameUI.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,16 +769,19 @@ friend class Drawable; // for selection/deselection transactions
769769

770770
// Render FPS Counter
771771
DisplayString * m_renderFpsString;
772+
DisplayString * m_renderFpsLowString;
772773
DisplayString * m_renderFpsLimitString;
773774
AsciiString m_renderFpsFont;
774775
Int m_renderFpsPointSize;
775776
Bool m_renderFpsBold;
776777
Coord2D m_renderFpsPosition;
777778
Color m_renderFpsColor;
779+
Color m_renderFpsLowColor;
778780
Color m_renderFpsLimitColor;
779781
Color m_renderFpsDropColor;
780782
UnsignedInt m_renderFpsRefreshMs;
781783
UnsignedInt m_lastRenderFps;
784+
UnsignedInt m_lastRenderFpsLow;
782785
UnsignedInt m_lastRenderFpsLimit;
783786
UnsignedInt m_lastRenderFpsUpdateMs;
784787

GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,7 @@ const FieldParse InGameUI::s_fieldParseTable[] =
917917
{ "RenderFpsBold", INI::parseBool, nullptr, offsetof( InGameUI, m_renderFpsBold ) },
918918
{ "RenderFpsPosition", INI::parseCoord2D, nullptr, offsetof( InGameUI, m_renderFpsPosition ) },
919919
{ "RenderFpsColor", INI::parseColorInt, nullptr, offsetof( InGameUI, m_renderFpsColor ) },
920+
{ "RenderFpsLowColor", INI::parseColorInt, nullptr, offsetof( InGameUI, m_renderFpsLowColor ) },
920921
{ "RenderFpsLimitColor", INI::parseColorInt, nullptr, offsetof( InGameUI, m_renderFpsLimitColor ) },
921922
{ "RenderFpsDropColor", INI::parseColorInt, nullptr, offsetof( InGameUI, m_renderFpsDropColor ) },
922923
{ "RenderFpsRefreshMs", INI::parseUnsignedInt, nullptr, offsetof( InGameUI, m_renderFpsRefreshMs ) },
@@ -1163,17 +1164,20 @@ InGameUI::InGameUI()
11631164
m_lastNetworkLatencyFrames = ~0u;
11641165

11651166
m_renderFpsString = nullptr;
1167+
m_renderFpsLowString = nullptr;
11661168
m_renderFpsLimitString = nullptr;
11671169
m_renderFpsFont = "Tahoma";
11681170
m_renderFpsPointSize = TheGlobalData->m_renderFpsFontSize;
11691171
m_renderFpsBold = TRUE;
11701172
m_renderFpsPosition.x = kHudAnchorX;
11711173
m_renderFpsPosition.y = kHudAnchorY;
11721174
m_renderFpsColor = GameMakeColor( 255, 255, 0, 255 );
1175+
m_renderFpsLowColor = GameMakeColor( 180, 170, 120, 255 );
11731176
m_renderFpsLimitColor = GameMakeColor(119, 119, 119, 255);
11741177
m_renderFpsDropColor = GameMakeColor( 0, 0, 0, 255 );
11751178
m_renderFpsRefreshMs = 1000;
11761179
m_lastRenderFps = ~0u;
1180+
m_lastRenderFpsLow = ~0u;
11771181
m_lastRenderFpsLimit = ~0u;
11781182
m_lastRenderFpsUpdateMs = 0u;
11791183

@@ -2272,6 +2276,8 @@ void InGameUI::freeCustomUiResources()
22722276
m_networkLatencyString = nullptr;
22732277
TheDisplayStringManager->freeDisplayString(m_renderFpsString);
22742278
m_renderFpsString = nullptr;
2279+
TheDisplayStringManager->freeDisplayString(m_renderFpsLowString);
2280+
m_renderFpsLowString = nullptr;
22752281
TheDisplayStringManager->freeDisplayString(m_renderFpsLimitString);
22762282
m_renderFpsLimitString = nullptr;
22772283
TheDisplayStringManager->freeDisplayString(m_systemTimeString);
@@ -6041,6 +6047,12 @@ void InGameUI::refreshRenderFpsResources()
60416047
m_lastRenderFpsUpdateMs = 0u;
60426048
}
60436049

6050+
if (!m_renderFpsLowString)
6051+
{
6052+
m_renderFpsLowString = TheDisplayStringManager->newDisplayString();
6053+
m_lastRenderFpsLow = ~0u;
6054+
}
6055+
60446056
if (!m_renderFpsLimitString)
60456057
{
60466058
m_renderFpsLimitString = TheDisplayStringManager->newDisplayString();
@@ -6051,6 +6063,7 @@ void InGameUI::refreshRenderFpsResources()
60516063
Int adjustedRenderFpsFontSize = TheGlobalLanguageData->adjustFontSize(m_renderFpsPointSize);
60526064
GameFont *fpsFont = TheWindowManager->winFindFont(m_renderFpsFont, adjustedRenderFpsFontSize, m_renderFpsBold);
60536065
m_renderFpsString->setFont(fpsFont);
6066+
m_renderFpsLowString->setFont(fpsFont);
60546067
m_renderFpsLimitString->setFont(fpsFont);
60556068

60566069
if (m_renderFpsPointSize > 0)
@@ -6163,6 +6176,15 @@ void InGameUI::updateRenderFpsString()
61636176
m_renderFpsString->setText(fpsStr);
61646177
m_lastRenderFps = renderFps;
61656178
}
6179+
6180+
const UnsignedInt renderFpsLow = (UnsignedInt)(TheDisplay->getLow1PercentFPS() + 0.5f);
6181+
if (renderFpsLow != m_lastRenderFpsLow)
6182+
{
6183+
UnicodeString fpsLowStr;
6184+
fpsLowStr.format(L"(%u)", renderFpsLow);
6185+
m_renderFpsLowString->setText(fpsLowStr);
6186+
m_lastRenderFpsLow = renderFpsLow;
6187+
}
61666188
}
61676189

61686190
void InGameUI::drawNetworkLatency(Int &x, Int &y)
@@ -6229,14 +6251,20 @@ void InGameUI::drawRenderFps(Int &x, Int &y)
62296251
const Int drawY = kHudAnchorY + y;
62306252

62316253
m_renderFpsString->draw(kHudAnchorX + x, drawY, m_renderFpsColor, m_renderFpsDropColor);
6232-
x += m_renderFpsString->getWidth();
6254+
x += m_renderFpsString->getWidth() + kHudGapPx / 2;
6255+
m_renderFpsLowString->draw(kHudAnchorX + x, drawY, m_renderFpsLowColor, m_renderFpsDropColor);
6256+
x += m_renderFpsLowString->getWidth() + kHudGapPx / 2;
62336257
m_renderFpsLimitString->draw(kHudAnchorX + x, drawY, m_renderFpsLimitColor, m_renderFpsDropColor);
62346258
x += m_renderFpsLimitString->getWidth() + kHudGapPx;
62356259
}
62366260
else
62376261
{
6238-
m_renderFpsString->draw(m_renderFpsPosition.x, m_renderFpsPosition.y, m_renderFpsColor, m_renderFpsDropColor);
6239-
m_renderFpsLimitString->draw(m_renderFpsPosition.x + m_renderFpsString->getWidth(), m_renderFpsPosition.y, m_renderFpsLimitColor, m_renderFpsDropColor);
6262+
Int currentX = m_renderFpsPosition.x;
6263+
m_renderFpsString->draw(currentX, m_renderFpsPosition.y, m_renderFpsColor, m_renderFpsDropColor);
6264+
currentX += m_renderFpsString->getWidth() + kHudGapPx / 2;
6265+
m_renderFpsLowString->draw(currentX, m_renderFpsPosition.y, m_renderFpsLowColor, m_renderFpsDropColor);
6266+
currentX += m_renderFpsLowString->getWidth() + kHudGapPx / 2;
6267+
m_renderFpsLimitString->draw(currentX, m_renderFpsPosition.y, m_renderFpsLimitColor, m_renderFpsDropColor);
62406268
}
62416269
}
62426270

0 commit comments

Comments
 (0)