1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-09-16 09:26:28 +02:00

Merge pull request #5927 from Laserlicht/fps_draw

optimized fps/battery box drawing
This commit is contained in:
Ivan Savenko
2025-07-18 23:08:42 +03:00
committed by GitHub
21 changed files with 107 additions and 49 deletions

View File

@@ -304,8 +304,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "选择长触延迟",
"vcmi.systemOptions.longTouchMenu.help" : "改变长触延迟。",
"vcmi.systemOptions.longTouchMenu.entry" : "%d 毫秒",
"vcmi.systemOptions.framerateButton.hover" : "显示FPS",
"vcmi.systemOptions.framerateButton.help" : "{显示FPS}\n\n切换在游戏窗口角落显FPS指示器。",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "触觉反馈",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{触觉反馈}\n\n切换触摸输入的触觉反馈。",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "界面增强",

View File

@@ -311,8 +311,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Vybrat dobu dlouhého podržení",
"vcmi.systemOptions.longTouchMenu.help" : "Změnit dobu dlouhého podržení.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d milisekund",
"vcmi.systemOptions.framerateButton.hover" : "Zobrazit FPS",
"vcmi.systemOptions.framerateButton.help" : "{Zobrazit FPS}\n\nPřepne viditelnost počítadla snímků za sekundu v rohu obrazovky hry.",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Vibrace",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Vibrace}\n\nPřepnout stav vibrací při dotykovém ovládání.",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Vylepšení rozhraní",

View File

@@ -97,6 +97,9 @@
"vcmi.randomMap.description.monster.normal" : "normal",
"vcmi.randomMap.description.monster.strong" : "strong",
"vcmi.overlay.battery" : "Battery",
"vcmi.overlay.charging" : "Charging",
"vcmi.spellBook.search" : "search...",
"vcmi.spellBook.tab.hover" : "%s Spells",
"vcmi.spellBook.tab.help" : "Turn to view %s spells",
@@ -313,8 +316,8 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Select Long Touch Interval",
"vcmi.systemOptions.longTouchMenu.help" : "Change duration of long touch interval.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d milliseconds",
"vcmi.systemOptions.framerateButton.hover" : "Show FPS",
"vcmi.systemOptions.framerateButton.help" : "{Show FPS}\n\nToggle the visibility of the Frames Per Second counter in the corner of the game window.",
"vcmi.systemOptions.performanceOverlayButton.hover" : "Show Performance Overlay",
"vcmi.systemOptions.performanceOverlayButton.help" : "{Show Performance Overlay}\n\nToggle the visibility of the overlay with additional information like frames per second, time and battery charge level (if available) in the corner of the game window.",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Haptic feedback",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Haptic feedback}\n\nToggle the haptic feedback on touch inputs.",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Interface Enhancements",

View File

@@ -68,8 +68,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Sélectionner l'intervalle de touche long",
"vcmi.systemOptions.longTouchMenu.help" : "Changer la durée de l'intervalle de touche long.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d millisecondes",
"vcmi.systemOptions.framerateButton.hover" : "Afficher les FPS",
"vcmi.systemOptions.framerateButton.help" : "{Show FPS}\n\nAfficher/masquer le compteur de Frames Par Seconde dans le coin de la fenêtre du jeu",
"vcmi.adventureOptions.infoBarPick.hover" : "Afficher les messages dans le panneau d'information",
"vcmi.adventureOptions.infoBarPick.help" : "{Show Messages in Info Panel}\n\nAutant que possible, les messages de jeu de la visite des objets de la carte seront affichés dans le panneau d'informations, au lieu de faire apparaître dans une fenêtre séparée.",

View File

@@ -97,6 +97,9 @@
"vcmi.randomMap.description.monster.normal" : "Normal",
"vcmi.randomMap.description.monster.strong" : "Stark",
"vcmi.overlay.battery" : "Batterie",
"vcmi.overlay.charging" : "Lädt",
"vcmi.spellBook.search" : "suchen...",
"vcmi.spellBook.tab.hover" : "%szauber",
"vcmi.spellBook.tab.help" : "Zu %szaubersprüchen blättern",
@@ -313,8 +316,8 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Wähle Dauer für Touch",
"vcmi.systemOptions.longTouchMenu.help" : "Ändere die Dauer für den langen Touch",
"vcmi.systemOptions.longTouchMenu.entry" : "%d Millisekunden",
"vcmi.systemOptions.framerateButton.hover" : "FPS anzeigen",
"vcmi.systemOptions.framerateButton.help" : "{FPS anzeigen}\n\n Schaltet die Sichtbarkeit des Zählers für die Bilder pro Sekunde in der Ecke des Spielfensters um.",
"vcmi.systemOptions.performanceOverlayButton.hover" : "Leistungs-Overlay anzeigen",
"vcmi.systemOptions.performanceOverlayButton.help" : "{Leistungs-Overlay anzeigen}\n\n Schaltet die Sichtbarkeit eines Overlays für zusätzliche Informationen, wie eines Zählers für die Bilder pro Sekunde, der Uhrzeit oder des Batterieladezustands (wenn verfügbar) in der Ecke des Spielfensters um.",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Haptisches Feedback",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Haptisches Feedback}\n\nHaptisches Feedback bei Touch-Eingaben.",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Interface Verbesserungen",

View File

@@ -292,8 +292,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Hosszú érintés időtartamának kiválasztása",
"vcmi.systemOptions.longTouchMenu.help" : "Hosszú érintés időtartamának módosítása.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d milliszekundum",
"vcmi.systemOptions.framerateButton.hover" : "FPS megjelenítése",
"vcmi.systemOptions.framerateButton.help" : "{FPS megjelenítése}\n\nA másodpercenkénti képkocka számláló láthatóságának váltása a játékablak sarkában.",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Rezgő visszacsatolás",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Rezgő visszacsatolás}\n\nA rezgő visszacsatolás engedélyezése vagy tiltása érintőbemeneteknél.",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Felület fejlesztések",

View File

@@ -294,8 +294,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Seleziona intervallo di tocco lungo",
"vcmi.systemOptions.longTouchMenu.help" : "Modifica la durata dell'intervallo di tocco lungo.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d millisecondi",
"vcmi.systemOptions.framerateButton.hover" : "Mostra FPS",
"vcmi.systemOptions.framerateButton.help" : "{Mostra FPS}\n\nAttiva o disattiva la visibilità del contatore dei fotogrammi al secondo nell'angolo della finestra di gioco.",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Feedback aptico",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Feedback aptico}\n\nAttiva o disattiva il feedback aptico sugli input tattili.",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Miglioramenti interfaccia",

View File

@@ -294,8 +294,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Wybierz czas długiego dotyku",
"vcmi.systemOptions.longTouchMenu.help" : "Nowy czas aktywacji długiego dotyku.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d milisekund",
"vcmi.systemOptions.framerateButton.hover" : "Pokaż FPS",
"vcmi.systemOptions.framerateButton.help" : "{Pokaż FPS}\n\n Przełącza widoczność licznika klatek na sekundę (FPS) w rogu okna gry.",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Wibracje urządzenia",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Wibracje urządzenia}\n\nWłącz wibracje na urządzeniu dotykowym",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Ulepszenia interfejsu",

View File

@@ -311,8 +311,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Selecionar Intervalo de Toque Longo",
"vcmi.systemOptions.longTouchMenu.help" : "Muda a duração do intervalo de toque longo.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d milissegundos",
"vcmi.systemOptions.framerateButton.hover" : "Mostrar QPS",
"vcmi.systemOptions.framerateButton.help" : "{Mostra os Quadros Por Segundo}\n\nAtiva ou desativa a visibilidade do contador de Quadros Por Segundo no canto da janela do jogo.",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Resposta Tátil",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Resposta Tátil}\n\nAtiva ou desativa a resposta tátil nos toques na tela.",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Aprimoramentos da Interface",

View File

@@ -290,8 +290,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Выбрать интервал длительного касания:",
"vcmi.systemOptions.longTouchMenu.help" : "Изменить интервал длительного касания.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d миллисекунд",
"vcmi.systemOptions.framerateButton.hover" : "Показывать частоту кадров",
"vcmi.systemOptions.framerateButton.help" : "{Показывать частоту кадров}\n\nЕсли выбрано, частота кадров в секунду будет показана в верхнем левом углу игрового экрана.",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Тактильный отклик",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Тактильный отклик}\n\nиспользовать вибрацию при использовании сенсорного экрана.",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Расширенные функции интерфейса",

View File

@@ -107,8 +107,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Seleccionar Intervalo de Toque Largo",
"vcmi.systemOptions.longTouchMenu.help" : "Cambia la duración del intervalo de toque largo.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d milisegundos",
"vcmi.systemOptions.framerateButton.hover" : "Mostrar FPS",
"vcmi.systemOptions.framerateButton.help" : "{Mostrar FPS}\n\nAlternar la visibilidad del contador de Frames Per Second en la esquina de la ventana del juego.",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Retroalimentación háptica",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Retroalimentación háptica}\n\nAlternar la retroalimentación háptica en las entradas táctiles.",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Mejoras de la interfaz",

View File

@@ -304,8 +304,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Välj tidsintervall för fördröjd pekskärmsberöringsmeny",
"vcmi.systemOptions.longTouchMenu.help" : "Ändra varaktighetsintervallet för fördröjd beröring.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d millisekunder",
"vcmi.systemOptions.framerateButton.hover" : "Visar FPS (skärmbilder per sekund)",
"vcmi.systemOptions.framerateButton.help" : "{Visa FPS}\n\nVisar räknaren för bildrutor per sekund i hörnet av spelfönstret.",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Haptisk återkoppling",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Haptisk feedback}\n\nÄndrar den haptiska feedbacken för berörings-input.",
"vcmi.systemOptions.enableUiEnhancementsButton.hover": "Förbättringar av användargränssnittet",

View File

@@ -308,8 +308,6 @@
"vcmi.systemOptions.longTouchMenu.hover" : "Виберіть інтервал довгого дотику",
"vcmi.systemOptions.longTouchMenu.help" : "Змінити тривалість інтервалу довгого дотику.",
"vcmi.systemOptions.longTouchMenu.entry" : "%d мілісекунд",
"vcmi.systemOptions.framerateButton.hover" : "Лічильник кадрів",
"vcmi.systemOptions.framerateButton.help" : "{Лічильник кадрів}\n\n Перемикає видимість лічильника кадрів на секунду у кутку ігрового вікна",
"vcmi.systemOptions.hapticFeedbackButton.hover" : "Тактильний відгук",
"vcmi.systemOptions.hapticFeedbackButton.help" : "{Тактильний відгук}\n\nВикористовувати вібрацію при використанні сенсорного екрану",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Розширення інтерфейсу",

View File

@@ -292,8 +292,6 @@
"vcmi.systemOptions.longTouchMenu.hover": "Chọn khoảng thời gian chạm giữ",
"vcmi.systemOptions.longTouchMenu.help": "Đổi khoảng thời gian chạm giữ.",
"vcmi.systemOptions.longTouchMenu.entry": "%d mili giây",
"vcmi.systemOptions.framerateButton.hover": "Hiện FPS",
"vcmi.systemOptions.framerateButton.help": "{Hiện FPS}\n\nHiện khung hình mỗi giây ở góc cửa sổ trò chơi",
"vcmi.systemOptions.hapticFeedbackButton.hover": "Rung khi chạm",
"vcmi.systemOptions.hapticFeedbackButton.help": "{Rung khi chạm}\n\nBật/ tắt chế độ rung khi chạm.",
"vcmi.systemOptions.enableUiEnhancementsButton.hover" : "Cải thiện giao diện",

View File

@@ -9,6 +9,7 @@
*/
#include "StdInc.h"
#include "GameEngine.h"
#include "GameLibrary.h"
#include "gui/CIntObject.h"
#include "gui/CursorHandler.h"
@@ -35,6 +36,8 @@
#include "../lib/AsyncRunner.h"
#include "../lib/CConfigHandler.h"
#include "../lib/texts/TextOperations.h"
#include "../lib/texts/CGeneralTextHandler.h"
#include <SDL_render.h>
@@ -125,8 +128,8 @@ void GameEngine::updateFrame()
handleEvents();
windows().simpleRedraw();
if (settings["video"]["showfps"].Bool())
drawFPSCounter();
if (settings["video"]["performanceOverlay"]["show"].Bool())
drawPerformanceOverlay();
screenHandlerInstance->updateScreenTexture();
@@ -184,14 +187,47 @@ Point GameEngine::screenDimensions() const
return screenHandlerInstance->getLogicalResolution();
}
void GameEngine::drawFPSCounter()
void GameEngine::drawPerformanceOverlay()
{
Canvas target = screenHandler().getScreenCanvas();
Rect targetArea(0, screenDimensions().y - 20, 48, 11);
std::string fps = std::to_string(framerate().getFramerate())+" FPS";
auto font = EFonts::FONT_SMALL;
const auto & fontPtr = ENGINE->renderHandler().loadFont(font);
target.drawColor(targetArea, ColorRGBA(10, 10, 10));
target.drawText(targetArea.center(), EFonts::FONT_SMALL, Colors::WHITE, ETextAlignment::CENTER, fps);
Canvas target = screenHandler().getScreenCanvas();
auto powerState = ENGINE->input().getPowerState();
std::string powerSymbol = ""; // add symbol if emoji are supported (e.g. VCMI extras)
if(powerState.powerState == PowerStateMode::ON_BATTERY)
powerSymbol = fontPtr->canRepresentCharacter("🔋") ? "🔋 " : (LIBRARY->generaltexth->translate("vcmi.overlay.battery") + " ");
else if(powerState.powerState == PowerStateMode::CHARGING)
powerSymbol = fontPtr->canRepresentCharacter("🔌") ? "🔌 " : (LIBRARY->generaltexth->translate("vcmi.overlay.charging") + " ");
std::string fps = std::to_string(framerate().getFramerate())+" FPS";
std::string time = TextOperations::getFormattedTimeLocal(std::time(nullptr));
std::string power = powerState.powerState == PowerStateMode::UNKNOWN ? "" : powerSymbol + std::to_string(powerState.percent) + "%";
std::string textToDisplay = time + (power.empty() ? "" : " | " + power) + " | " + fps;
maxPerformanceOverlayTextWidth = std::max(maxPerformanceOverlayTextWidth, static_cast<int>(fontPtr->getStringWidth(textToDisplay))); // do not get smaller (can cause graphical glitches)
Rect targetArea;
std::string edge = settings["video"]["performanceOverlay"]["edge"].String();
int marginTopBottom = settings["video"]["performanceOverlay"]["marginTopBottom"].Integer();
int marginLeftRight = settings["video"]["performanceOverlay"]["marginLeftRight"].Integer();
Point boxSize(maxPerformanceOverlayTextWidth + 6, fontPtr->getLineHeight() + 2);
if (edge == "topleft")
targetArea = Rect(marginLeftRight, marginTopBottom, boxSize.x, boxSize.y);
else if (edge == "topright")
targetArea = Rect(screenDimensions().x - marginLeftRight - boxSize.x, marginTopBottom, boxSize.x, boxSize.y);
else if (edge == "bottomleft")
targetArea = Rect(marginLeftRight, screenDimensions().y - marginTopBottom - boxSize.y, boxSize.x, boxSize.y);
else if (edge == "bottomright")
targetArea = Rect(screenDimensions().x - marginLeftRight - boxSize.x, screenDimensions().y - marginTopBottom - boxSize.y, boxSize.x, boxSize.y);
target.drawColor(targetArea.resize(1), Colors::BRIGHT_YELLOW);
target.drawColor(targetArea, ColorRGBA(0, 0, 0));
target.drawText(targetArea.center(), font, Colors::WHITE, ETextAlignment::CENTER, textToDisplay);
}
bool GameEngine::amIGuiThread()

View File

@@ -57,9 +57,11 @@ private:
IGameEngineUser *engineUser = nullptr;
int maxPerformanceOverlayTextWidth = 0;
void updateFrame();
void handleEvents(); //takes events from queue and calls interested objects
void drawFPSCounter(); // draws the FPS to the upper left corner of the screen
void drawPerformanceOverlay(); // draws box with additional infos (e.g. fps)
public:
std::mutex interfaceMutex;

View File

@@ -33,6 +33,7 @@
#include <SDL_events.h>
#include <SDL_timer.h>
#include <SDL_clipboard.h>
#include <SDL_power.h>
InputHandler::InputHandler()
: enableMouse(settings["input"]["enableMouse"].Bool())
@@ -148,6 +149,21 @@ void InputHandler::copyToClipBoard(const std::string & text)
SDL_SetClipboardText(text.c_str());
}
PowerState InputHandler::getPowerState()
{
int seconds;
int percent;
auto sdlPowerState = SDL_GetPowerInfo(&seconds, &percent);
PowerStateMode powerState = PowerStateMode::UNKNOWN;
if(sdlPowerState == SDL_POWERSTATE_ON_BATTERY)
powerState = PowerStateMode::ON_BATTERY;
else if(sdlPowerState == SDL_POWERSTATE_CHARGING || sdlPowerState == SDL_POWERSTATE_CHARGED)
powerState = PowerStateMode::CHARGING;
return PowerState{powerState, seconds, percent};
}
std::vector<SDL_Event> InputHandler::acquireEvents()
{
std::unique_lock<std::mutex> lock(eventsMutex);

View File

@@ -32,6 +32,19 @@ enum class InputMode
CONTROLLER
};
enum class PowerStateMode
{
UNKNOWN,
CHARGING,
ON_BATTERY
};
struct PowerState {
PowerStateMode powerState;
int seconds;
int percent;
};
class InputHandler
{
std::vector<SDL_Event> eventsQueue;
@@ -111,4 +124,5 @@ public:
InputMode getCurrentInputMode();
void copyToClipBoard(const std::string & text);
PowerState getPowerState();
};

View File

@@ -152,9 +152,10 @@ GeneralOptionsTab::GeneralOptionsTab()
{
selectLongTouchDuration();
});
addCallback("framerateChanged", [](bool value)
addCallback("performanceOverlayChanged", [](bool value)
{
setBoolSetting("video", "showfps", value);
Settings gameRes = settings.write["video"]["performanceOverlay"];
gameRes["show"].Bool() = value;
});
addCallback("hapticFeedbackChanged", [](bool value)
{
@@ -225,8 +226,8 @@ GeneralOptionsTab::GeneralOptionsTab()
if (fullscreenExclusiveCheckbox)
fullscreenExclusiveCheckbox->setSelected(settings["video"]["fullscreen"].Bool() && settings["video"]["realFullscreen"].Bool());
std::shared_ptr<CToggleButton> framerateCheckbox = widget<CToggleButton>("framerateCheckbox");
framerateCheckbox->setSelected(settings["video"]["showfps"].Bool());
std::shared_ptr<CToggleButton> infoboxCheckbox = widget<CToggleButton>("performanceOverlayCheckbox");
infoboxCheckbox->setSelected(settings["video"]["performanceOverlay"]["show"].Bool());
std::shared_ptr<CToggleButton> hapticFeedbackCheckbox = widget<CToggleButton>("hapticFeedbackCheckbox");
if (hapticFeedbackCheckbox)

View File

@@ -210,7 +210,7 @@
"spellbookAnimation",
"driver",
"displayIndex",
"showfps",
"performanceOverlay",
"targetfps",
"vsync",
"fontsType",
@@ -270,9 +270,16 @@
"type" : "number",
"default" : 0
},
"showfps" : {
"type" : "boolean",
"default" : false
"performanceOverlay" : {
"type" : "object",
"additionalProperties" : false,
"required" : [ "show", "edge", "marginTopBottom", "marginLeftRight" ],
"properties" : {
"show" : { "type" : "boolean", "default" : false },
"edge" : { "type" : "string", "enum" : [ "topleft", "topright", "bottomleft", "bottomright" ], "default" : "bottomleft" },
"marginTopBottom" : { "type" : "number", "default" : 5 },
"marginLeftRight" : { "type" : "number", "default" : 7 }
}
},
"targetfps" : {
"type" : "number",

View File

@@ -50,7 +50,7 @@
"created" : "desktop"
},
{
"text": "vcmi.systemOptions.framerateButton.hover"
"text": "vcmi.systemOptions.performanceOverlayButton.hover"
},
{
"text": "vcmi.systemOptions.enableLargeSpellbookButton.hover"
@@ -136,9 +136,9 @@
"created" : "desktop"
},
{
"name": "framerateCheckbox",
"help": "vcmi.systemOptions.framerateButton",
"callback": "framerateChanged"
"name": "performanceOverlayCheckbox",
"help": "vcmi.systemOptions.performanceOverlayButton",
"callback": "performanceOverlayChanged"
},
{
"name": "enableLargeSpellbookCheckbox",