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(Containers::Array<Measurement>&& measurements, std::size_t maxFrameCount) noexcept {
FrameProfiler::FrameProfiler(Containers::Array<Measurement>&& measurements, UnsignedInt maxFrameCount) noexcept {
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:
_enabled{other._enabled},
@ -105,7 +105,7 @@ FrameProfiler& FrameProfiler::operator=(FrameProfiler&& other) noexcept {
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", );
_maxFrameCount = maxFrameCount;
@ -127,7 +127,7 @@ void FrameProfiler::setup(Containers::Array<Measurement>&& measurements, const s
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);
}
@ -171,7 +171,7 @@ void FrameProfiler::beginFrame() {
}
/* For delay = 1 returns _currentData */
std::size_t FrameProfiler::delayedCurrentData(UnsignedInt delay) const {
UnsignedInt FrameProfiler::delayedCurrentData(UnsignedInt delay) const {
CORRADE_INTERNAL_ASSERT(delay >= 1);
/* The delayed frame is current or before current */
@ -253,25 +253,25 @@ void FrameProfiler::endFrame() {
_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(),
"DebugTools::FrameProfiler::measurementName(): index" << id << "out of range for" << _measurements.size() << "measurements", {});
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(),
"DebugTools::FrameProfiler::measurementUnits(): index" << id << "out of range for" << _measurements.size() << "measurements", {});
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(),
"DebugTools::FrameProfiler::measurementDelay(): index" << id << "out of range for" << _measurements.size() << "measurements", {});
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(),
"DebugTools::FrameProfiler::measurementDelay(): index" << id << "out of range for" << _measurements.size() << "measurements", {});
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);
}
Double FrameProfiler::measurementMean(const std::size_t id) const {
Double FrameProfiler::measurementMean(const UnsignedInt id) const {
CORRADE_ASSERT(id < _measurements.size(),
"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", {});
@ -391,13 +391,13 @@ std::string FrameProfiler::statistics() const {
return out.str();
}
void FrameProfiler::printStatistics(const std::size_t frequency) const {
void FrameProfiler::printStatistics(const UnsignedInt frequency) const {
Debug::Flags flags;
if(!Debug::isTty()) flags |= Debug::Flag::DisableColors;
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 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(const Values values, const std::size_t maxFrameCount): GLFrameProfiler{}
GLFrameProfiler::GLFrameProfiler(const Values values, const UnsignedInt maxFrameCount): GLFrameProfiler{}
{
setup(values, maxFrameCount);
}
@ -466,7 +466,7 @@ GLFrameProfiler& GLFrameProfiler::operator=(GLFrameProfiler&&) noexcept = defaul
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;
Containers::Array<Measurement> measurements;
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
* @ref setup() afterwards.
*/
explicit FrameProfiler(Containers::Array<Measurement>&& measurements, std::size_t maxFrameCount) noexcept;
explicit FrameProfiler(Containers::Array<Measurement>&& measurements, UnsignedInt maxFrameCount) noexcept;
/** @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 */
FrameProfiler(const FrameProfiler&) = delete;
@ -205,10 +205,10 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* existing measurements with @p measurements and reset
* @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 */
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 */
bool isEnabled() const { return _enabled; }
@ -264,7 +264,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* calculated only from @ref measuredFrameCount(). Always at least
* @cpp 1 @ce.
*/
std::size_t maxFrameCount() const { return _maxFrameCount; }
UnsignedInt maxFrameCount() const { return _maxFrameCount; }
/**
* @brief Count of measured frames
@ -274,7 +274,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* average over last @ref maxFrameCount() frames only. Actual data
* availability depends on @ref measurementDelay().
*/
std::size_t measuredFrameCount() const { return _measuredFrameCount; }
UnsignedInt measuredFrameCount() const { return _measuredFrameCount; }
/**
* @brief Measurement count
@ -282,7 +282,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* Count of @ref Measurement instances passed to @ref setup(). If
* @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
@ -291,7 +291,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* passed to @ref setup(). Expects that @p id is less than
* @ref measurementCount().
*/
std::string measurementName(std::size_t id) const;
std::string measurementName(UnsignedInt id) const;
/**
* @brief Measurement units
@ -300,7 +300,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* passed to @ref setup(). Expects that @p id is less than
* @ref measurementCount().
*/
Units measurementUnits(std::size_t id) const;
Units measurementUnits(UnsignedInt id) const;
/**
* @brief Measurement delay
@ -311,7 +311,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* measurement in the list passed to @ref setup(). Expects that @p id
* is less than @ref measurementCount().
*/
UnsignedInt measurementDelay(std::size_t id) const;
UnsignedInt measurementDelay(UnsignedInt id) const;
/**
* @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
* @ref measurementCount().
*/
bool isMeasurementAvailable(std::size_t id) const;
bool isMeasurementAvailable(UnsignedInt id) const;
/**
* @brief Measurement mean
@ -337,7 +337,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* @ref measurementCount() and that the measurement is available.
* @see @ref isMeasurementAvailable()
*/
Double measurementMean(std::size_t id) const;
Double measurementMean(UnsignedInt id) const;
/**
* @brief Overview of all measurements
@ -359,27 +359,27 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
* @see @ref isMeasurementAvailable(), @ref isEnabled()
* @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
*
* 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
* @ref Corrade::Utility::Error) and uses it to decide whether the
* output is a TTY and whether to print colors.
* @see @ref Corrade::Utility::Debug::isTty(),
* @ref Corrade::Utility::Debug::Flag::DisableColors
*/
void printStatistics(Debug& out, std::size_t frequency) const;
void printStatistics(Debug& out, UnsignedInt frequency) const;
/** @overload */
void printStatistics(Debug&& out, std::size_t frequency) const {
void printStatistics(Debug&& out, UnsignedInt frequency) const {
printStatistics(out, frequency);
}
private:
std::size_t delayedCurrentData(UnsignedInt delay) const;
UnsignedInt delayedCurrentData(UnsignedInt delay) const;
Double measurementDataInternal(const Measurement& measurement) const;
void printStatisticsInternal(Debug& out) const;
@ -389,7 +389,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT FrameProfiler {
asserts get disabled */
bool _beginFrameCalled{};
#endif
std::size_t _currentData{}, _maxFrameCount{1}, _measuredFrameCount{};
UnsignedInt _currentData{}, _maxFrameCount{1}, _measuredFrameCount{};
Containers::Array<Measurement> _measurements;
Containers::Array<UnsignedLong> _data;
};
@ -500,7 +500,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT GLFrameProfiler: public FrameProfiler {
/**
* @brief Measured value
*
* @see @ref Values, @ref GLFrameProfiler(Values, std::size_t),
* @see @ref Values, @ref GLFrameProfiler(Values, UnsignedInt),
* @ref setup()
*/
enum class Value: UnsignedShort {
@ -560,7 +560,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT GLFrameProfiler: public FrameProfiler {
/**
* @brief Measured values
*
* @see @ref GLFrameProfiler(Values, std::size_t), @ref setup()
* @see @ref GLFrameProfiler(Values, UnsignedInt), @ref setup()
*/
typedef Containers::EnumSet<Value> Values;
@ -577,7 +577,7 @@ class MAGNUM_DEBUGTOOLS_EXPORT GLFrameProfiler: public FrameProfiler {
* Equivalent to default-constructing an instance and calling
* @ref setup() afterwards.
*/
explicit GLFrameProfiler(Values values, std::size_t maxFrameCount);
explicit GLFrameProfiler(Values values, UnsignedInt maxFrameCount);
/** @brief Copying is not allowed */
GLFrameProfiler(const GLFrameProfiler&) = delete;
@ -603,13 +603,13 @@ class MAGNUM_DEBUGTOOLS_EXPORT GLFrameProfiler: public FrameProfiler {
* existing measurements with @p measurements and reset
* @ref measuredFrameCount() back to @cpp 0 @ce.
*/
void setup(Values values, std::size_t maxFrameCount);
void setup(Values values, UnsignedInt maxFrameCount);
/**
* @brief Measured values
*
* 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;

Loading…
Cancel
Save