demo: Use get_fps() in fishbowl demo
Hopefully that leads to somewhat more reliable fps measurements
This commit is contained in:
@@ -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--;
|
||||||
|
|||||||
Reference in New Issue
Block a user