1
0

add stopwatch

This commit is contained in:
2026-01-09 19:29:39 +08:00
parent ff34754274
commit fba5d0627c
4 changed files with 57 additions and 0 deletions

View File

@@ -4,6 +4,7 @@ PRIVATE
main.cpp
dll_loader.cpp
cmd_client.cpp
stopwatch.cpp
)
target_sources(BasaltPresenter
PUBLIC
@@ -11,6 +12,7 @@ FILE_SET HEADERS
FILES
dll_loader.hpp
cmd_client.hpp
stopwatch.hpp
)
target_include_directories(BasaltPresenter
PUBLIC

View File

@@ -1,5 +1,6 @@
#include "dll_loader.hpp"
#include "cmd_client.hpp"
#include "stopwatch.hpp"
#include <basalt/char_types.hpp>
#include <basalt/engine.hpp>
#include <basalt/deliver.hpp>
@@ -16,6 +17,7 @@ using dll_loader::DllKind;
using dll_loader::DllLoader;
using ::basalt::presenter::cmd_client::CmdClient;
using ::basalt::presenter::stopwatch::Stopwatch;
int main(int argc, char* argv[]) {
auto engine_dll = DllLoader(DllKind::Engine, BSTEXT("BasaltDirectX11Engine"));
@@ -30,8 +32,10 @@ int main(int argc, char* argv[]) {
EngineConfig engine_config{.headless = false, .width = payload.width, .height = payload.height};
engine->startup(std::move(engine_config));
Stopwatch stopwatch(120);
while (true) {
auto req_stop = engine->tick();
stopwatch.tick();
auto can_stop = client.tick(req_stop);
if (can_stop) break;
}

View File

@@ -0,0 +1,30 @@
#include "stopwatch.hpp"
#include <print>
namespace basalt::presenter::stopwatch {
Stopwatch::Stopwatch(size_t interval) : start_point(std::chrono::high_resolution_clock::now()), interval(interval), counter(0) {}
Stopwatch::~Stopwatch() {}
void Stopwatch::tick() {
// 自增计时器
++this->counter;
if (this->counter >= this->interval) {
// 计数器归零
this->counter = 0;
// 记下当前时刻计算帧时间和FPS
auto stop_point = std::chrono::high_resolution_clock::now();
auto time_diff = std::chrono::duration_cast<std::chrono::milliseconds>(stop_point - this->start_point);
auto frame_time = static_cast<double>(time_diff.count()) / this->interval;
auto fps = 1000.0 / frame_time;
// 输出给用户
std::print("FPS: {:.2f} Frame Time: {:.4f} ms\n", fps, frame_time);
// 把结束时间设置为开始时间继续下一轮循环
this->start_point = stop_point;
}
}
} // namespace basalt::presenter::stopwatch

View File

@@ -0,0 +1,21 @@
#pragma once
#include <chrono>
namespace basalt::presenter::stopwatch {
/**
* @brief 一个简单的FPS计算器每隔指定次数统计一次FPS并输出
*/
class Stopwatch {
public:
Stopwatch(size_t interval);
~Stopwatch();
void tick();
private:
std::chrono::steady_clock::time_point start_point;
size_t interval, counter;
};
} // namespace basalt::presenter::stopwatch