mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-14 03:39:57 +01:00
Implementation of FPS monitor in Mixer (fixed dt precision) and Plot
monitor of FPS in toolbox.
This commit is contained in:
@@ -74,7 +74,7 @@ void FrameBuffer::init()
|
|||||||
// attach the 2D texture to intermediate FBO
|
// attach the 2D texture to intermediate FBO
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureid_, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureid_, 0);
|
||||||
|
|
||||||
Log::Info("New FBO %d Multi Sampling ", framebufferid_);
|
// Log::Info("New FBO %d Multi Sampling ", framebufferid_);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -82,7 +82,7 @@ void FrameBuffer::init()
|
|||||||
// direct attach the 2D texture to FBO
|
// direct attach the 2D texture to FBO
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureid_, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureid_, 0);
|
||||||
|
|
||||||
Log::Info("New FBO %d Single Sampling ", framebufferid_);
|
// Log::Info("New FBO %d Single Sampling ", framebufferid_);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkFramebufferStatus();
|
checkFramebufferStatus();
|
||||||
|
|||||||
@@ -583,7 +583,11 @@ void MediaPlayer::update()
|
|||||||
{
|
{
|
||||||
glBindTexture(GL_TEXTURE_2D, textureindex_);
|
glBindTexture(GL_TEXTURE_2D, textureindex_);
|
||||||
|
|
||||||
|
// use dual Pixel Buffer Object
|
||||||
if (pbo_size_ > 0) {
|
if (pbo_size_ > 0) {
|
||||||
|
// In dual PBO mode, increment current index first then get the next index
|
||||||
|
pbo_index_ = (pbo_index_ + 1) % 2;
|
||||||
|
pbo_next_index_ = (pbo_index_ + 1) % 2;
|
||||||
|
|
||||||
// bind PBO to read pixels
|
// bind PBO to read pixels
|
||||||
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo_[pbo_index_]);
|
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo_[pbo_index_]);
|
||||||
@@ -597,6 +601,7 @@ void MediaPlayer::update()
|
|||||||
// See http://www.songho.ca/opengl/gl_pbo.html#map for more details
|
// See http://www.songho.ca/opengl/gl_pbo.html#map for more details
|
||||||
glBufferData(GL_PIXEL_UNPACK_BUFFER, pbo_size_, 0, GL_STREAM_DRAW);
|
glBufferData(GL_PIXEL_UNPACK_BUFFER, pbo_size_, 0, GL_STREAM_DRAW);
|
||||||
// map the buffer object into client's memory
|
// map the buffer object into client's memory
|
||||||
|
// GLubyte* ptr = (GLubyte*) glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, pbo_size_, GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_BUFFER_BIT);
|
||||||
GLubyte* ptr = (GLubyte*) glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
|
GLubyte* ptr = (GLubyte*) glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
// update data directly on the mapped buffer
|
// update data directly on the mapped buffer
|
||||||
@@ -608,10 +613,6 @@ void MediaPlayer::update()
|
|||||||
}
|
}
|
||||||
// done with PBO
|
// done with PBO
|
||||||
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
||||||
|
|
||||||
// In dual PBO mode, increment current index first then get the next index
|
|
||||||
pbo_index_ = (pbo_index_ + 1) % 2;
|
|
||||||
pbo_next_index_ = (pbo_index_ + 1) % 2;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
// without PBO, use standard opengl (slower)
|
// without PBO, use standard opengl (slower)
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ static void saveSession(const std::string& filename, Session *session)
|
|||||||
sessionThreadActive_ = false;
|
sessionThreadActive_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mixer::Mixer() : session_(nullptr), back_session_(nullptr), current_view_(nullptr)
|
Mixer::Mixer() : session_(nullptr), back_session_(nullptr), current_view_(nullptr), fps_(60.f)
|
||||||
{
|
{
|
||||||
// unsused initial empty session
|
// unsused initial empty session
|
||||||
session_ = new Session;
|
session_ = new Session;
|
||||||
@@ -183,7 +183,10 @@ void Mixer::update()
|
|||||||
if (update_time_ == GST_CLOCK_TIME_NONE)
|
if (update_time_ == GST_CLOCK_TIME_NONE)
|
||||||
update_time_ = gst_util_get_timestamp ();
|
update_time_ = gst_util_get_timestamp ();
|
||||||
gint64 current_time = gst_util_get_timestamp ();
|
gint64 current_time = gst_util_get_timestamp ();
|
||||||
float dt = static_cast<float>( GST_TIME_AS_MSECONDS(current_time - update_time_) ) * 0.001f;
|
// dt is in mulisecond, with fractional precision (from micro seconds)
|
||||||
|
float dt = static_cast<float>( GST_TIME_AS_USECONDS(current_time - update_time_) * 0.001f);
|
||||||
|
if (dt > 0.1f)
|
||||||
|
fps_ = 0.9f * fps_ + 100.f / dt;
|
||||||
update_time_ = current_time;
|
update_time_ = current_time;
|
||||||
|
|
||||||
// insert source candidate for this session
|
// insert source candidate for this session
|
||||||
@@ -402,7 +405,6 @@ void Mixer::setCurrentSource(SourceList::iterator it)
|
|||||||
|
|
||||||
// show status as current
|
// show status as current
|
||||||
(*current_source_)->setMode(Source::CURRENT);
|
(*current_source_)->setMode(Source::CURRENT);
|
||||||
Log::Info("setCurrentSource");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
3
Mixer.h
3
Mixer.h
@@ -38,6 +38,7 @@ public:
|
|||||||
|
|
||||||
// draw session and current view
|
// draw session and current view
|
||||||
void draw();
|
void draw();
|
||||||
|
inline float frameRate() const { return fps_;}
|
||||||
|
|
||||||
// creation of sources
|
// creation of sources
|
||||||
Source * createSourceFile (std::string path);
|
Source * createSourceFile (std::string path);
|
||||||
@@ -96,7 +97,7 @@ protected:
|
|||||||
View *current_view_;
|
View *current_view_;
|
||||||
|
|
||||||
gint64 update_time_;
|
gint64 update_time_;
|
||||||
|
float fps_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MIXER_H
|
#endif // MIXER_H
|
||||||
|
|||||||
@@ -692,8 +692,37 @@ void ToolBox::Render()
|
|||||||
ImGui::EndMenuBar();
|
ImGui::EndMenuBar();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::End(); // "v-mix"
|
ImVec2 plot_size = ImGui::GetContentRegionAvail();
|
||||||
|
plot_size.y *= 0.5;
|
||||||
|
|
||||||
|
static float mixer_framerate_values[120] = {60.f};
|
||||||
|
static float io_framerate_values[120] = {60.f};
|
||||||
|
static int values_offset = 0;
|
||||||
|
values_offset = (values_offset+1) % IM_ARRAYSIZE(mixer_framerate_values);
|
||||||
|
mixer_framerate_values[values_offset] = Mixer::manager().frameRate();
|
||||||
|
io_framerate_values[values_offset] = ImGui::GetIO().Framerate;
|
||||||
|
|
||||||
|
// plot FPS graph
|
||||||
|
{
|
||||||
|
float average = 0.0f;
|
||||||
|
for (int n = 0; n < IM_ARRAYSIZE(mixer_framerate_values); n++)
|
||||||
|
average += mixer_framerate_values[n];
|
||||||
|
average /= (float)IM_ARRAYSIZE(mixer_framerate_values);
|
||||||
|
char overlay[32];
|
||||||
|
sprintf(overlay, "Mixer FPS %.2f", average);
|
||||||
|
ImGui::PlotLines("LinesMixer", mixer_framerate_values, IM_ARRAYSIZE(mixer_framerate_values), values_offset, overlay, 40.0f, 65.0f, plot_size);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
float average = 0.0f;
|
||||||
|
for (int n = 0; n < IM_ARRAYSIZE(mixer_framerate_values); n++)
|
||||||
|
average += mixer_framerate_values[n];
|
||||||
|
average /= (float)IM_ARRAYSIZE(mixer_framerate_values);
|
||||||
|
char overlay[32];
|
||||||
|
sprintf(overlay, "Render FPS %.2f", average);
|
||||||
|
ImGui::PlotLines("LinesRender", io_framerate_values, IM_ARRAYSIZE(io_framerate_values), values_offset, overlay, 40.0f, 65.0f, plot_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::End(); // "v-mix"
|
||||||
|
|
||||||
// About and other utility windows
|
// About and other utility windows
|
||||||
if (show_icons_window)
|
if (show_icons_window)
|
||||||
@@ -702,6 +731,7 @@ void ToolBox::Render()
|
|||||||
ImGui::ShowDemoWindow(&show_demo_window);
|
ImGui::ShowDemoWindow(&show_demo_window);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//static void Square(ImGuiSizeCallbackData* data) {
|
//static void Square(ImGuiSizeCallbackData* data) {
|
||||||
@@ -742,7 +772,7 @@ void UserInterface::RenderPreview()
|
|||||||
draw_list->AddRectFilled(draw_pos, ImVec2(draw_pos.x + width, draw_pos.y + ImGui::GetTextLineHeightWithSpacing()), IM_COL32(55, 55, 55, 200));
|
draw_list->AddRectFilled(draw_pos, ImVec2(draw_pos.x + width, draw_pos.y + ImGui::GetTextLineHeightWithSpacing()), IM_COL32(55, 55, 55, 200));
|
||||||
|
|
||||||
ImGui::SetCursorScreenPos(draw_pos);
|
ImGui::SetCursorScreenPos(draw_pos);
|
||||||
ImGui::Text(" %d x %d px, %.1f fps", output->width(), output->height(), ImGui::GetIO().Framerate );
|
ImGui::Text(" %d x %d px, %.1f fps", output->width(), output->height(), Mixer::manager().frameRate() );
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
|||||||
Reference in New Issue
Block a user