This commit is contained in:
Dentomologist 2026-03-17 15:48:33 -04:00 committed by GitHub
commit 8f33c96021
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 24 deletions

View File

@ -4,8 +4,10 @@
#include "Core/DolphinAnalytics.h"
#include <array>
#include <chrono>
#include <memory>
#include <mutex>
#include <random>
#include <string>
#include <utility>
#include <vector>
@ -29,7 +31,6 @@
#include "Common/Config/Config.h"
#include "Common/Crypto/SHA1.h"
#include "Common/Random.h"
#include "Common/Timer.h"
#include "Common/Version.h"
#include "Core/Config/GraphicsSettings.h"
#include "Core/Config/MainSettings.h"
@ -45,7 +46,24 @@
namespace
{
constexpr char ANALYTICS_ENDPOINT[] = "https://analytics.dolphin-emu.org/report";
using namespace std::chrono_literals;
// Performance sampling configuration constants.
//
// 5min after startup + rand(0, 3min) jitter time, sample performance for 100 frames in a row.
// Each sampling thereafter happens 30min + rand(0, 3min) after the previous one.
static constexpr int NUM_PERFORMANCE_SAMPLES_PER_REPORT = 100;
static constexpr auto PERFORMANCE_SAMPLING_BASE_INITIAL_WAIT = 5min;
static constexpr auto PERFORMANCE_SAMPLING_BASE_INTERVAL_WAIT = 30min;
static constexpr std::chrono::microseconds PERFORMANCE_SAMPLING_WAIT_MAX_JITTER = 3min;
std::chrono::microseconds GetWaitJitter()
{
std::random_device device;
std::uniform_int_distribution<> distribution(0, PERFORMANCE_SAMPLING_WAIT_MAX_JITTER.count());
return std::chrono::microseconds(distribution(device));
}
} // namespace
#if defined(ANDROID)
@ -92,7 +110,8 @@ void DolphinAnalytics::ReloadConfig()
std::unique_ptr<Common::AnalyticsReportingBackend> new_backend;
if (m_last_analytics_enabled)
{
new_backend = std::make_unique<Common::HttpAnalyticsBackend>(ANALYTICS_ENDPOINT);
constexpr char analytics_endpoint[] = "https://analytics.dolphin-emu.org/report";
new_backend = std::make_unique<Common::HttpAnalyticsBackend>(analytics_endpoint);
}
m_reporter.SetBackend(std::move(new_backend));
@ -192,7 +211,7 @@ static_assert(GAME_QUIRKS_NAMES.size() == static_cast<u32>(GameQuirk::Count),
void DolphinAnalytics::ReportGameQuirk(GameQuirk quirk)
{
u32 quirk_idx = static_cast<u32>(quirk);
const u32 quirk_idx = static_cast<u32>(quirk);
// Only report once per run.
if (m_reported_quirks[quirk_idx])
@ -250,21 +269,18 @@ void DolphinAnalytics::InitializePerformanceSampling()
m_performance_samples.clear();
m_sampling_performance_info = false;
u64 wait_us =
PERFORMANCE_SAMPLING_INITIAL_WAIT_TIME_SECS * 1000000 +
Common::Random::GenerateValue<u64>() % (PERFORMANCE_SAMPLING_WAIT_TIME_JITTER_SECS * 1000000);
m_sampling_next_start_us = Common::Timer::NowUs() + wait_us;
m_sampling_next_start_time =
std::chrono::steady_clock::now() + PERFORMANCE_SAMPLING_BASE_INITIAL_WAIT + GetWaitJitter();
}
bool DolphinAnalytics::ShouldStartPerformanceSampling()
{
if (Common::Timer::NowUs() < m_sampling_next_start_us)
const auto now = std::chrono::steady_clock::now();
if (now < m_sampling_next_start_time)
return false;
u64 wait_us =
PERFORMANCE_SAMPLING_INTERVAL_SECS * 1000000 +
Common::Random::GenerateValue<u64>() % (PERFORMANCE_SAMPLING_WAIT_TIME_JITTER_SECS * 1000000);
m_sampling_next_start_us = Common::Timer::NowUs() + wait_us;
m_sampling_next_start_time = now + PERFORMANCE_SAMPLING_BASE_INTERVAL_WAIT + GetWaitJitter();
return true;
}

View File

@ -4,13 +4,13 @@
#pragma once
#include <array>
#include <chrono>
#include <mutex>
#include <string>
#include <string_view>
#include <vector>
#include "Common/Analytics.h"
#include "Common/CommonTypes.h"
#include "Common/Config/Config.h"
#if defined(ANDROID)
@ -173,19 +173,10 @@ private:
// values created by MakeUniqueId.
std::string m_unique_id;
// Performance sampling configuration constants.
//
// 5min after startup + rand(0, 3min) jitter time, collect performance for 100 frames in a row.
// Repeat collection after 30min + rand(0, 3min).
static constexpr int NUM_PERFORMANCE_SAMPLES_PER_REPORT = 100;
static constexpr int PERFORMANCE_SAMPLING_INITIAL_WAIT_TIME_SECS = 300;
static constexpr int PERFORMANCE_SAMPLING_WAIT_TIME_JITTER_SECS = 180;
static constexpr int PERFORMANCE_SAMPLING_INTERVAL_SECS = 1800;
// Performance sampling state & internal helpers.
void InitializePerformanceSampling(); // Called on game start / title switch.
bool ShouldStartPerformanceSampling();
u64 m_sampling_next_start_us; // Next timestamp (in us) at which to trigger sampling.
std::chrono::steady_clock::time_point m_sampling_next_start_time;
bool m_sampling_performance_info = false; // Whether we are currently collecting samples.
std::vector<PerformanceSample> m_performance_samples;