DebugActor use ring buffer to collect frame statistics
This commit is contained in:
parent
074283d065
commit
922a9757c0
|
|
@ -45,6 +45,7 @@ private:
|
|||
} // namespace
|
||||
|
||||
DebugActor::DebugActor()
|
||||
: frame_buffer_(70 /* pre-alloc for 70 frames */)
|
||||
{
|
||||
SetName("kiwano-debug-actor");
|
||||
SetPosition(Point{ 10, 10 });
|
||||
|
|
@ -77,10 +78,10 @@ void DebugActor::OnRender(RenderContext& ctx)
|
|||
ctx.FillRoundedRectangle(GetBounds(), Vec2{ 5.f, 5.f });
|
||||
ctx.DrawTextLayout(debug_text_, Point(10, 10));
|
||||
|
||||
frame_time_.push_back(Time::Now());
|
||||
while (frame_time_.back() - frame_time_.front() >= Duration::Second)
|
||||
frame_buffer_.PushBack(Time::Now());
|
||||
while (frame_buffer_.Back() - frame_buffer_.Front() >= Duration::Second)
|
||||
{
|
||||
frame_time_.erase(frame_time_.begin());
|
||||
frame_buffer_.PopFront();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -93,7 +94,7 @@ void DebugActor::OnUpdate(Duration dt)
|
|||
// For formatting integers with commas
|
||||
(void)ss.imbue(comma_locale_);
|
||||
|
||||
ss << "Fps: " << frame_time_.size() << std::endl;
|
||||
ss << "Fps: " << frame_buffer_.Size() << std::endl;
|
||||
|
||||
#if defined(KGE_DEBUG)
|
||||
if (ObjectBase::IsTracingLeaks())
|
||||
|
|
@ -106,7 +107,7 @@ void DebugActor::OnUpdate(Duration dt)
|
|||
|
||||
ss << "Render: " << status.duration.Milliseconds() << "ms" << std::endl;
|
||||
|
||||
ss << "Primitives / sec: " << std::fixed << status.primitives * frame_time_.size() << std::endl;
|
||||
ss << "Primitives / sec: " << std::fixed << status.primitives * frame_buffer_.Size() << std::endl;
|
||||
|
||||
ss << "Memory: ";
|
||||
{
|
||||
|
|
|
|||
|
|
@ -24,6 +24,99 @@
|
|||
|
||||
namespace kiwano
|
||||
{
|
||||
|
||||
template <typename T>
|
||||
class SimpleRingBuffer
|
||||
{
|
||||
public:
|
||||
SimpleRingBuffer(size_t capcity)
|
||||
{
|
||||
Reserve(capcity);
|
||||
}
|
||||
|
||||
void PushBack(const T& val)
|
||||
{
|
||||
if (IsFull())
|
||||
Reserve(Capacity() * 2);
|
||||
buffer_[rear_] = val;
|
||||
IncreaseRear();
|
||||
}
|
||||
|
||||
void PopFront()
|
||||
{
|
||||
IncreaseFront();
|
||||
}
|
||||
|
||||
const T& Front() const
|
||||
{
|
||||
return buffer_[front_];
|
||||
}
|
||||
|
||||
T& Front()
|
||||
{
|
||||
return buffer_[front_];
|
||||
}
|
||||
|
||||
const T& Back() const
|
||||
{
|
||||
return buffer_[ClampCursor(rear_, 1)];
|
||||
}
|
||||
|
||||
T& Back()
|
||||
{
|
||||
return buffer_[ClampCursor(rear_, 1)];
|
||||
}
|
||||
|
||||
bool IsEmpty() const noexcept
|
||||
{
|
||||
return front_ = rear_;
|
||||
}
|
||||
|
||||
bool IsFull() const noexcept
|
||||
{
|
||||
return front_ == (rear_ + 1) % Capacity();
|
||||
}
|
||||
|
||||
size_t Size() const
|
||||
{
|
||||
return ClampCursor(rear_, front_);
|
||||
}
|
||||
|
||||
size_t Capacity() const
|
||||
{
|
||||
return buffer_.size();
|
||||
}
|
||||
|
||||
void Reserve(size_t capacity)
|
||||
{
|
||||
buffer_.resize(capacity);
|
||||
}
|
||||
|
||||
private:
|
||||
void IncreaseFront()
|
||||
{
|
||||
if (buffer_.empty())
|
||||
return;
|
||||
front_ = (front_ + 1) % Capacity();
|
||||
}
|
||||
|
||||
void IncreaseRear()
|
||||
{
|
||||
rear_ = (rear_ + 1) % Capacity();
|
||||
}
|
||||
|
||||
size_t ClampCursor(size_t cursor, size_t off) const
|
||||
{
|
||||
return (cursor + Capacity() - off) % Capacity();
|
||||
}
|
||||
|
||||
private:
|
||||
Vector<T> buffer_;
|
||||
size_t front_ = 0;
|
||||
size_t rear_ = 0;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* \addtogroup Actors
|
||||
* @{
|
||||
|
|
@ -52,7 +145,8 @@ private:
|
|||
BrushPtr background_brush_;
|
||||
TextStyle debug_text_style_;
|
||||
TextLayout debug_text_;
|
||||
List<Time> frame_time_;
|
||||
|
||||
SimpleRingBuffer<Time> frame_buffer_;
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
|
|
|||
Loading…
Reference in New Issue