[xswiftbus] Added FPS monitoring

This commit is contained in:
Mat Sutcliffe
2019-12-31 21:22:00 +00:00
parent 836eb107a3
commit 516c8a2fce
5 changed files with 84 additions and 2 deletions

View File

@@ -23,12 +23,54 @@ using namespace BlackMisc::Simulation::XPlane::QtFreeUtils;
namespace XSwiftBus
{
CService::CService(CSettingsProvider *settingsProvider) : CDBusObject(settingsProvider)
//! \private
struct CService::FramePeriodSampler : public CDrawable
{
DataRef<xplane::data::sim::operation::misc::frame_rate_period> m_thisFramePeriod;
DataRef<xplane::data::sim::time::framerate_period> m_thisFramePeriodXP11;
std::vector<float> m_samples;
float m_total = 0;
size_t m_lastSampleIndex = 0;
static constexpr size_t c_maxSampleCount = 500;
FramePeriodSampler() : CDrawable(xplm_Phase_LastCockpit, false) {}
float getAverageFPS()
{
if (m_total == 0) { return 0; }
const float fps = m_samples.size() / m_total;
m_total = 0;
m_samples.clear();
m_lastSampleIndex = 0;
return fps;
}
protected:
virtual void draw() override // called once per frame
{
float current = m_thisFramePeriodXP11.isValid() ? m_thisFramePeriodXP11.get() : m_thisFramePeriod.get();
++m_lastSampleIndex %= c_maxSampleCount;
if (m_samples.size() == c_maxSampleCount)
{
m_total -= m_samples[m_lastSampleIndex];
m_samples[m_lastSampleIndex] = current;
}
else { m_samples.push_back(current); }
m_total += m_samples[m_lastSampleIndex];
}
};
CService::CService(CSettingsProvider *settingsProvider) :
CDBusObject(settingsProvider),
m_framePeriodSampler(std::make_unique<FramePeriodSampler>())
{
this->updateAirportsInRange();
this->updateMessageBoxFromSettings();
m_framePeriodSampler->show();
}
CService::~CService() = default;
void CService::onAircraftModelChanged()
{
char filename[256];
@@ -63,6 +105,12 @@ namespace XSwiftBus
return XSWIFTBUS_COMMIT;
}
double CService::getAverageFPS()
{
if (!m_framePeriodSampler) { return 0; }
return static_cast<double>(m_framePeriodSampler->getAverageFPS());
}
void CService::addTextMessage(const std::string &text, double red, double green, double blue)
{
if (text.empty()) { return; }