demo: Use get_fps() in fishbowl demo

Hopefully that leads to somewhat more reliable fps measurements
This commit is contained in:
Benjamin Otte
2024-03-22 19:42:31 +01:00
parent 3080e2974d
commit 02d7817632

View File

@@ -456,43 +456,33 @@ gtk_fishbowl_do_update (GtkFishbowl *fishbowl)
{ {
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl); GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
GdkFrameClock *frame_clock; GdkFrameClock *frame_clock;
GdkFrameTimings *start, *end; GdkFrameTimings *end;
gint64 start_counter, end_counter; gint64 end_counter;
gint64 n_frames, expected_frames; double fps, expected_fps;
gint64 start_timestamp, end_timestamp;
gint64 interval; gint64 interval;
frame_clock = gtk_widget_get_frame_clock (GTK_WIDGET (fishbowl)); frame_clock = gtk_widget_get_frame_clock (GTK_WIDGET (fishbowl));
if (frame_clock == NULL) if (frame_clock == NULL)
return; return;
start_counter = gdk_frame_clock_get_history_start (frame_clock); fps = gdk_frame_clock_get_fps (frame_clock);
end_counter = gdk_frame_clock_get_frame_counter (frame_clock); if (fps <= 0.0)
start = gdk_frame_clock_get_timings (frame_clock, start_counter);
for (end = gdk_frame_clock_get_timings (frame_clock, end_counter);
end_counter > start_counter && end != NULL && !gdk_frame_timings_get_complete (end);
end = gdk_frame_clock_get_timings (frame_clock, end_counter))
end_counter--;
if (end_counter - start_counter < 4)
return; return;
start_timestamp = gdk_frame_timings_get_presentation_time (start); priv->framerate = fps;
end_timestamp = gdk_frame_timings_get_presentation_time (end);
if (start_timestamp == 0 || end_timestamp == 0)
{
start_timestamp = gdk_frame_timings_get_frame_time (start);
end_timestamp = gdk_frame_timings_get_frame_time (end);
}
n_frames = end_counter - start_counter;
priv->framerate = ((double) n_frames) * G_USEC_PER_SEC / (end_timestamp - start_timestamp);
priv->framerate = ((int)(priv->framerate * 100))/100.0;
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE]); g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE]);
if (!priv->benchmark) if (!priv->benchmark)
return; return;
end_counter = gdk_frame_clock_get_frame_counter (frame_clock);
for (end = gdk_frame_clock_get_timings (frame_clock, end_counter);
end != NULL && !gdk_frame_timings_get_complete (end);
end = gdk_frame_clock_get_timings (frame_clock, end_counter))
end_counter--;
if (end == NULL)
return;
interval = gdk_frame_timings_get_refresh_interval (end); interval = gdk_frame_timings_get_refresh_interval (end);
if (interval == 0) if (interval == 0)
{ {
@@ -500,16 +490,16 @@ gtk_fishbowl_do_update (GtkFishbowl *fishbowl)
if (interval == 0) if (interval == 0)
return; return;
} }
expected_frames = round ((double) (end_timestamp - start_timestamp) / interval); expected_fps = (double) G_USEC_PER_SEC / interval;
if (n_frames >= expected_frames) if (fps > (expected_fps - 1))
{ {
if (priv->last_benchmark_change > 0) if (priv->last_benchmark_change > 0)
priv->last_benchmark_change *= 2; priv->last_benchmark_change *= 2;
else else
priv->last_benchmark_change = 1; priv->last_benchmark_change = 1;
} }
else if (n_frames + 1 < expected_frames) else if (0.95 * fps < expected_fps)
{ {
if (priv->last_benchmark_change < 0) if (priv->last_benchmark_change < 0)
priv->last_benchmark_change--; priv->last_benchmark_change--;