出於測試目的,我真的很想能夠手動控制我的GTK3應用程序的幀刷新率。慢下來很容易,我只是睡在渲染功能。但是,我可以實現的最大幀速率是我的顯示器60Hz的刷新率。手動控制GTK小部件重繪打勾速率
我發現,我可以添加一個不封頂更新插槽插使用gdk_threads_add_idle
主循環,但即使我稱之爲gtk_gl_area_queue_render
這個函數實際渲染功能只能運行在我的顯示器的刷新率內。
有沒有辦法強制重新渲染是「立即」的要求?我試過手動調用渲染槽,這會導致重新渲染函數立即被調用,但它根本不會更新屏幕。
void update_auto(gpointer user_data)
{
// ... do some update stuff
// somehow get the appropriate GtkGLArea from user_data
GtkGLArea* area = get_area(user_data);
gtk_gl_area_queue_render(area);
// capped at 60Hz
}
void update_manual(gpointer user_data)
{
// ... do some update stuff
// somehow get the appropriate GtkGLArea from user_data
GtkGLArea* area = get_area(user_data);
gtk_gl_area_make_current(area);
render(area,gtk_gl_area_get_context(area), user_data);
// even though render was called, screen never updates
}
void render(GtkGLArea* area, GdkGLContext* context, gpointer user_data)
{
// ... render
}
void setup_widget()
{
// ... some init stuff
// only one of these is used at a time
#if TEST_FLAG == 0
gdk_threads_add_idle(update_manual, user_data);
#elif TEST_FLAG == 1
gdk_threads_add_idle(update_auto, user_data);
#elif TEST_FLAG == 2
gtk_widget_add_tick_callback((GtkWidget*) area, update_auto, user_data, NULL);
#else
gtk_widget_add_tick_callback((GtkWidget*) area, update_manual, user_data, NULL);
#endif
}
渲染速度比顯示器的刷新速度還要快嗎? –
我現在的一個原因是性能測試。我感興趣的是渲染循環中的各種代碼更改如何影響性能,我寧願不必使用足夠大的場景來顯着減慢渲染循環。我也想調試一些不規則的框架口吃問題,在較大的場景發生。 – helloworld922
也許渲染引擎*不會更快地刷新。我不知道這是否適用於LED/LCD顯示器,但是舊的CRT刷新是在反激期完成的,以創建平滑的幀過渡。 –