Browse Source

DebugTools: moving average over a year worth of frames isn't useful.

That would generate 32 GB of data. I think the technology isn't ready
for this yet, so I think capping the frame count (and everything else)
at 32 bits is enough.
pull/442/head
Vladimír Vondruš 6 years ago
parent
commit
6c7e798d86
  1. 28
      src/Magnum/DebugTools/FrameProfiler.cpp
  2. 46
      src/Magnum/DebugTools/FrameProfiler.h

28
src/Magnum/DebugTools/FrameProfiler.cpp

@ -57,11 +57,11 @@ FrameProfiler::Measurement::Measurement(const std::string& name, const Units uni
FrameProfiler::FrameProfiler() noexcept = default; FrameProfiler::FrameProfiler() noexcept = default;
FrameProfiler::FrameProfiler(Containers::Array<Measurement>&& measurements, std::size_t maxFrameCount) noexcept { FrameProfiler::FrameProfiler(Containers::Array<Measurement>&& measurements, UnsignedInt maxFrameCount) noexcept {
setup(std::move(measurements), maxFrameCount); setup(std::move(measurements), maxFrameCount);
} }
FrameProfiler::FrameProfiler(const std::initializer_list<Measurement> measurements, const std::size_t maxFrameCount): FrameProfiler{Containers::array(measurements), maxFrameCount} {} FrameProfiler::FrameProfiler(const std::initializer_list<Measurement> measurements, const UnsignedInt maxFrameCount): FrameProfiler{Containers::array(measurements), maxFrameCount} {}
FrameProfiler::FrameProfiler(FrameProfiler&& other) noexcept: FrameProfiler::FrameProfiler(FrameProfiler&& other) noexcept:
_enabled{other._enabled}, _enabled{other._enabled},
@ -105,7 +105,7 @@ FrameProfiler& FrameProfiler::operator=(FrameProfiler&& other) noexcept {
return *this; return *this;
} }
void FrameProfiler::setup(Containers::Array<Measurement>&& measurements, const std::size_t maxFrameCount) { void FrameProfiler::setup(Containers::Array<Measurement>&& measurements, const UnsignedInt maxFrameCount) {
CORRADE_ASSERT(maxFrameCount >= 1, "DebugTools::FrameProfiler::setup(): max frame count can't be zero", ); CORRADE_ASSERT(maxFrameCount >= 1, "DebugTools::FrameProfiler::setup(): max frame count can't be zero", );
_maxFrameCount = maxFrameCount; _maxFrameCount = maxFrameCount;
@ -127,7 +127,7 @@ void FrameProfiler::setup(Containers::Array<Measurement>&& measurements, const s
enable(); enable();
} }
void FrameProfiler::setup(const std::initializer_list<Measurement> measurements, const std::size_t maxFrameCount) { void FrameProfiler::setup(const std::initializer_list<Measurement> measurements, const UnsignedInt maxFrameCount) {
setup(Containers::array(measurements), maxFrameCount); setup(Containers::array(measurements), maxFrameCount);
} }
@ -171,7 +171,7 @@ void FrameProfiler::beginFrame() {
} }
/* For delay = 1 returns _currentData */ /* For delay = 1 returns _currentData */
std::size_t FrameProfiler::delayedCurrentData(UnsignedInt delay) const { UnsignedInt FrameProfiler::delayedCurrentData(UnsignedInt delay) const {
CORRADE_INTERNAL_ASSERT(delay >= 1); CORRADE_INTERNAL_ASSERT(delay >= 1);
/* The delayed frame is current or before current */ /* The delayed frame is current or before current */
@ -253,25 +253,25 @@ void FrameProfiler::endFrame() {
_currentData = (_currentData + 1) % _maxFrameCount; _currentData = (_currentData + 1) % _maxFrameCount;
} }
std::string FrameProfiler::measurementName(const std::size_t id) const { std::string FrameProfiler::measurementName(const UnsignedInt id) const {
CORRADE_ASSERT(id < _measurements.size(), CORRADE_ASSERT(id < _measurements.size(),
"DebugTools::FrameProfiler::measurementName(): index" << id << "out of range for" << _measurements.size() << "measurements", {}); "DebugTools::FrameProfiler::measurementName(): index" << id << "out of range for" << _measurements.size() << "measurements", {});
return _measurements[id]._name; return _measurements[id]._name;
} }
FrameProfiler::Units FrameProfiler::measurementUnits(const std::size_t id) const { FrameProfiler::Units FrameProfiler::measurementUnits(const UnsignedInt id) const {
CORRADE_ASSERT(id < _measurements.size(), CORRADE_ASSERT(id < _measurements.size(),
"DebugTools::FrameProfiler::measurementUnits(): index" << id << "out of range for" << _measurements.size() << "measurements", {}); "DebugTools::FrameProfiler::measurementUnits(): index" << id << "out of range for" << _measurements.size() << "measurements", {});
return _measurements[id]._units; return _measurements[id]._units;
} }
UnsignedInt FrameProfiler::measurementDelay(const std::size_t id) const { UnsignedInt FrameProfiler::measurementDelay(const UnsignedInt id) const {
CORRADE_ASSERT(id < _measurements.size(), CORRADE_ASSERT(id < _measurements.size(),
"DebugTools::FrameProfiler::measurementDelay(): index" << id << "out of range for" << _measurements.size() << "measurements", {}); "DebugTools::FrameProfiler::measurementDelay(): index" << id << "out of range for" << _measurements.size() << "measurements", {});
return Math::max(_measurements[id]._delay, 1u); return Math::max(_measurements[id]._delay, 1u);
} }
bool FrameProfiler::isMeasurementAvailable(const std::size_t id) const { bool FrameProfiler::isMeasurementAvailable(const UnsignedInt id) const {
CORRADE_ASSERT(id < _measurements.size(), CORRADE_ASSERT(id < _measurements.size(),
"DebugTools::FrameProfiler::measurementDelay(): index" << id << "out of range for" << _measurements.size() << "measurements", {}); "DebugTools::FrameProfiler::measurementDelay(): index" << id << "out of range for" << _measurements.size() << "measurements", {});
return _measuredFrameCount >= Math::max(_measurements[id]._delay, 1u); return _measuredFrameCount >= Math::max(_measurements[id]._delay, 1u);
@ -282,7 +282,7 @@ Double FrameProfiler::measurementDataInternal(const Measurement& measurement) co
Math::min(_measuredFrameCount - Math::max(measurement._delay, 1u) + 1, _maxFrameCount); Math::min(_measuredFrameCount - Math::max(measurement._delay, 1u) + 1, _maxFrameCount);
} }
Double FrameProfiler::measurementMean(const std::size_t id) const { Double FrameProfiler::measurementMean(const UnsignedInt id) const {
CORRADE_ASSERT(id < _measurements.size(), CORRADE_ASSERT(id < _measurements.size(),
"DebugTools::FrameProfiler::measurementMean(): index" << id << "out of range for" << _measurements.size() << "measurements", {}); "DebugTools::FrameProfiler::measurementMean(): index" << id << "out of range for" << _measurements.size() << "measurements", {});
CORRADE_ASSERT(_measuredFrameCount >= Math::max(_measurements[id]._delay, 1u), "DebugTools::FrameProfiler::measurementMean(): measurement data available after" << Math::max(_measurements[id]._delay, 1u) - _measuredFrameCount << "more frames", {}); CORRADE_ASSERT(_measuredFrameCount >= Math::max(_measurements[id]._delay, 1u), "DebugTools::FrameProfiler::measurementMean(): measurement data available after" << Math::max(_measurements[id]._delay, 1u) - _measuredFrameCount << "more frames", {});
@ -391,13 +391,13 @@ std::string FrameProfiler::statistics() const {
return out.str(); return out.str();
} }
void FrameProfiler::printStatistics(const std::size_t frequency) const { void FrameProfiler::printStatistics(const UnsignedInt frequency) const {
Debug::Flags flags; Debug::Flags flags;
if(!Debug::isTty()) flags |= Debug::Flag::DisableColors; if(!Debug::isTty()) flags |= Debug::Flag::DisableColors;
printStatistics(Debug{flags}, frequency); printStatistics(Debug{flags}, frequency);
} }
void FrameProfiler::printStatistics(Debug& out, const std::size_t frequency) const { void FrameProfiler::printStatistics(Debug& out, const UnsignedInt frequency) const {
if(!isEnabled() || _measuredFrameCount % frequency != 0) return; if(!isEnabled() || _measuredFrameCount % frequency != 0) return;
/* If on a TTY and we printed at least something already, scroll back up to /* If on a TTY and we printed at least something already, scroll back up to
@ -455,7 +455,7 @@ struct GLFrameProfiler::State {
GLFrameProfiler::GLFrameProfiler(): _state{Containers::InPlaceInit} {} GLFrameProfiler::GLFrameProfiler(): _state{Containers::InPlaceInit} {}
GLFrameProfiler::GLFrameProfiler(const Values values, const std::size_t maxFrameCount): GLFrameProfiler{} GLFrameProfiler::GLFrameProfiler(const Values values, const UnsignedInt maxFrameCount): GLFrameProfiler{}
{ {
setup(values, maxFrameCount); setup(values, maxFrameCount);
} }
@ -466,7 +466,7 @@ GLFrameProfiler& GLFrameProfiler::operator=(GLFrameProfiler&&) noexcept = defaul
GLFrameProfiler::~GLFrameProfiler() = default; GLFrameProfiler::~GLFrameProfiler() = default;
void GLFrameProfiler::setup(const Values values, const std::size_t maxFrameCount) { void GLFrameProfiler::setup(const Values values, const UnsignedInt maxFrameCount) {
UnsignedShort index = 0; UnsignedShort index = 0;
Containers::Array<Measurement> measurements; Containers::Array<Measurement> measurements;
if(values & Value::FrameTime) { if(values & Value::FrameTime) {

46
src/Magnum/DebugTools/FrameProfiler.h

@ -178,10 +178,10 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* Equivalent to default-constructing an instance and calling * Equivalent to default-constructing an instance and calling
* @ref setup() afterwards. * @ref setup() afterwards.
*/ */
explicit FrameProfiler(Containers::Array<Measurement>&& measurements, std::size_t maxFrameCount) noexcept; explicit FrameProfiler(Containers::Array<Measurement>&& measurements, UnsignedInt maxFrameCount) noexcept;
/** @overload */ /** @overload */
explicit FrameProfiler(std::initializer_list<Measurement> measurements, std::size_t maxFrameCount); explicit FrameProfiler(std::initializer_list<Measurement> measurements, UnsignedInt maxFrameCount);
/** @brief Copying is not allowed */ /** @brief Copying is not allowed */
FrameProfiler(const FrameProfiler&) = delete; FrameProfiler(const FrameProfiler&) = delete;
@ -205,10 +205,10 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* existing measurements with @p measurements and reset * existing measurements with @p measurements and reset
* @ref measuredFrameCount() back to @cpp 0 @ce. * @ref measuredFrameCount() back to @cpp 0 @ce.
*/ */
void setup(Containers::Array<Measurement>&& measurements, std::size_t maxFrameCount); void setup(Containers::Array<Measurement>&& measurements, UnsignedInt maxFrameCount);
/** @overload */ /** @overload */
void setup(std::initializer_list<Measurement> measurements, std::size_t maxFrameCount); void setup(std::initializer_list<Measurement> measurements, UnsignedInt maxFrameCount);
/** @brief Whether the profiling is enabled */ /** @brief Whether the profiling is enabled */
bool isEnabled() const { return _enabled; } bool isEnabled() const { return _enabled; }
@ -264,7 +264,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* calculated only from @ref measuredFrameCount(). Always at least * calculated only from @ref measuredFrameCount(). Always at least
* @cpp 1 @ce. * @cpp 1 @ce.
*/ */
std::size_t maxFrameCount() const { return _maxFrameCount; } UnsignedInt maxFrameCount() const { return _maxFrameCount; }
/** /**
* @brief Count of measured frames * @brief Count of measured frames
@ -274,7 +274,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* average over last @ref maxFrameCount() frames only. Actual data * average over last @ref maxFrameCount() frames only. Actual data
* availability depends on @ref measurementDelay(). * availability depends on @ref measurementDelay().
*/ */
std::size_t measuredFrameCount() const { return _measuredFrameCount; } UnsignedInt measuredFrameCount() const { return _measuredFrameCount; }
/** /**
* @brief Measurement count * @brief Measurement count
@ -282,7 +282,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* Count of @ref Measurement instances passed to @ref setup(). If * Count of @ref Measurement instances passed to @ref setup(). If
* @ref setup() was not called yet, returns @cpp 0 @ce. * @ref setup() was not called yet, returns @cpp 0 @ce.
*/ */
std::size_t measurementCount() const { return _measurements.size(); } UnsignedInt measurementCount() const { return _measurements.size(); }
/** /**
* @brief Measurement name * @brief Measurement name
@ -291,7 +291,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* passed to @ref setup(). Expects that @p id is less than * passed to @ref setup(). Expects that @p id is less than
* @ref measurementCount(). * @ref measurementCount().
*/ */
std::string measurementName(std::size_t id) const; std::string measurementName(UnsignedInt id) const;
/** /**
* @brief Measurement units * @brief Measurement units
@ -300,7 +300,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* passed to @ref setup(). Expects that @p id is less than * passed to @ref setup(). Expects that @p id is less than
* @ref measurementCount(). * @ref measurementCount().
*/ */
Units measurementUnits(std::size_t id) const; Units measurementUnits(UnsignedInt id) const;
/** /**
* @brief Measurement delay * @brief Measurement delay
@ -311,7 +311,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* measurement in the list passed to @ref setup(). Expects that @p id * measurement in the list passed to @ref setup(). Expects that @p id
* is less than @ref measurementCount(). * is less than @ref measurementCount().
*/ */
UnsignedInt measurementDelay(std::size_t id) const; UnsignedInt measurementDelay(UnsignedInt id) const;
/** /**
* @brief Whether given measurement is available * @brief Whether given measurement is available
@ -322,7 +322,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* passed to @ref setup(). Expects that @p id is less than * passed to @ref setup(). Expects that @p id is less than
* @ref measurementCount(). * @ref measurementCount().
*/ */
bool isMeasurementAvailable(std::size_t id) const; bool isMeasurementAvailable(UnsignedInt id) const;
/** /**
* @brief Measurement mean * @brief Measurement mean
@ -337,7 +337,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* @ref measurementCount() and that the measurement is available. * @ref measurementCount() and that the measurement is available.
* @see @ref isMeasurementAvailable() * @see @ref isMeasurementAvailable()
*/ */
Double measurementMean(std::size_t id) const; Double measurementMean(UnsignedInt id) const;
/** /**
* @brief Overview of all measurements * @brief Overview of all measurements
@ -359,27 +359,27 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* @see @ref isMeasurementAvailable(), @ref isEnabled() * @see @ref isMeasurementAvailable(), @ref isEnabled()
* @ref Corrade::Utility::Debug::isTty() * @ref Corrade::Utility::Debug::isTty()
*/ */
void printStatistics(std::size_t frequency) const; void printStatistics(UnsignedInt frequency) const;
/** /**
* @brief Print an overview of all measurements to given output at given rate * @brief Print an overview of all measurements to given output at given rate
* *
* Compared to @ref printStatistics(std::size_t) const prints to given * Compared to @ref printStatistics(UnsignedInt) const prints to given
* @p out (which can be also @ref Corrade::Utility::Warning or * @p out (which can be also @ref Corrade::Utility::Warning or
* @ref Corrade::Utility::Error) and uses it to decide whether the * @ref Corrade::Utility::Error) and uses it to decide whether the
* output is a TTY and whether to print colors. * output is a TTY and whether to print colors.
* @see @ref Corrade::Utility::Debug::isTty(), * @see @ref Corrade::Utility::Debug::isTty(),
* @ref Corrade::Utility::Debug::Flag::DisableColors * @ref Corrade::Utility::Debug::Flag::DisableColors
*/ */
void printStatistics(Debug& out, std::size_t frequency) const; void printStatistics(Debug& out, UnsignedInt frequency) const;
/** @overload */ /** @overload */
void printStatistics(Debug&& out, std::size_t frequency) const { void printStatistics(Debug&& out, UnsignedInt frequency) const {
printStatistics(out, frequency); printStatistics(out, frequency);
} }
private: private:
std::size_t delayedCurrentData(UnsignedInt delay) const; UnsignedInt delayedCurrentData(UnsignedInt delay) const;
Double measurementDataInternal(const Measurement& measurement) const; Double measurementDataInternal(const Measurement& measurement) const;
void printStatisticsInternal(Debug& out) const; void printStatisticsInternal(Debug& out) const;
@ -389,7 +389,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
asserts get disabled */ asserts get disabled */
bool _beginFrameCalled{}; bool _beginFrameCalled{};
#endif #endif
std::size_t _currentData{}, _maxFrameCount{1}, _measuredFrameCount{}; UnsignedInt _currentData{}, _maxFrameCount{1}, _measuredFrameCount{};
Containers::Array<Measurement> _measurements; Containers::Array<Measurement> _measurements;
Containers::Array<UnsignedLong> _data; Containers::Array<UnsignedLong> _data;
}; };
@ -500,7 +500,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT GLFrameProfiler: public FrameProfiler {
/** /**
* @brief Measured value * @brief Measured value
* *
* @see @ref Values, @ref GLFrameProfiler(Values, std::size_t), * @see @ref Values, @ref GLFrameProfiler(Values, UnsignedInt),
* @ref setup() * @ref setup()
*/ */
enum class Value: UnsignedShort { enum class Value: UnsignedShort {
@ -560,7 +560,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT GLFrameProfiler: public FrameProfiler {
/** /**
* @brief Measured values * @brief Measured values
* *
* @see @ref GLFrameProfiler(Values, std::size_t), @ref setup() * @see @ref GLFrameProfiler(Values, UnsignedInt), @ref setup()
*/ */
typedef Containers::EnumSet<Value> Values; typedef Containers::EnumSet<Value> Values;
@ -577,7 +577,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT GLFrameProfiler: public FrameProfiler {
* Equivalent to default-constructing an instance and calling * Equivalent to default-constructing an instance and calling
* @ref setup() afterwards. * @ref setup() afterwards.
*/ */
explicit GLFrameProfiler(Values values, std::size_t maxFrameCount); explicit GLFrameProfiler(Values values, UnsignedInt maxFrameCount);
/** @brief Copying is not allowed */ /** @brief Copying is not allowed */
GLFrameProfiler(const GLFrameProfiler&) = delete; GLFrameProfiler(const GLFrameProfiler&) = delete;
@ -603,13 +603,13 @@ class MAGNUM_DEBUGTOOLS_EXPORT GLFrameProfiler: public FrameProfiler {
* existing measurements with @p measurements and reset * existing measurements with @p measurements and reset
* @ref measuredFrameCount() back to @cpp 0 @ce. * @ref measuredFrameCount() back to @cpp 0 @ce.
*/ */
void setup(Values values, std::size_t maxFrameCount); void setup(Values values, UnsignedInt maxFrameCount);
/** /**
* @brief Measured values * @brief Measured values
* *
* Corresponds to the @p values parameter passed to * Corresponds to the @p values parameter passed to
* @ref GLFrameProfiler(Values, std::size_t) or @ref setup(). * @ref GLFrameProfiler(Values, UnsignedInt) or @ref setup().
*/ */
Values values() const; Values values() const;

Loading…
Cancel
Save