Я создаю приложение GTK+ 3, которое рисует анимацию с помощью Cairo в виджете GtkDrawingArea. Я получаю визуальные сбои, подобные тем, которые наблюдаются на изображениях ниже. Они появляются только для одного кадра, их может не быть ни одного, или один, или более одного на кадр. Прошу помощи в выявлении возможной проблемы. Вот подробности моего кода:
В моем основном методе перед запуском цикла gtk_main()
я подключаю тайм-аут.
g_timeout_add(50, queue_draw, gtk_builder_get_object(builder, "window"));
"window"
— это идентификатор моего GtkWindow. Функция queue_draw
выглядит следующим образом:
gboolean queue_draw(gpointer user_data)
{
gtk_widget_queue_draw(GTK_WIDGET(user_data));
return TRUE;
}
Я бы подумал, что могу передать этой функции объект GtkDrawingArea, а не весь GtkWindow, но в этом случае анимация исчезает. Меня также интересуют комментарии к такому поведению, но это не мой главный вопрос.
Сигнал отрисовки моего GtkDrawingArea привязан к функции gboolean drawing_area_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data)
. Внутри этого метода я рисую свою трехмерную гистограмму с помощью алгоритма ленивого художника, каждый столбец состоит из трех параллелограммов, а столбцы рисуются в порядке z.
Проблема не в том, что мой компьютер не справляется с рендерингом кадров, каким-то образом повреждая буфер кадров. Я установил тайм-аут на 1000 мс, чтобы захватить изображения ниже.
Я не звонил gtk_widget_set_double_buffered()
.
Мне не удалось обнаружить проблему в подсистеме Windows для Linux (WSL) с использованием XMing в качестве X-сервера, что заставляет меня думать, что это может быть проблема с библиотекой или какое-то плохо определенное поведение.
На первом изображении визуальный сбой во время нормальной работы моей программы. Во втором я изменил код и установил плавный градиент высоты столбцов. Это дает гораздо лучшее представление о проблеме, но все еще очень озадачивает.
сведения о пакете библиотеки разработки:
$ dpkg --list | egrep 'lib(cairo|gtk).*-dev'
ii libcairo2-dev:amd64 1.15.10-2ubuntu0.1 amd64 Development files for the Cairo 2D graphics library
ii libgtk-3-dev:amd64 3.22.30-1ubuntu3 amd64 development files for the GTK+ library
сведения о метаинформации библиотеки:
$ pkg-config --modversion gtk+-3.0 glib-2.0 gdk-pixbuf-2.0 cairo
3.22.30
2.58.1
2.36.11
1.15.10
х11 детали:
$ xdpyinfo | head -n 5
name of display: :0
version number: 11.0
vendor string: The X.Org Foundation
vendor release number: 12001000
X.Org version: 1.20.1
Сведения о Linux (на самом деле Zorin OS 15, а не Ubuntu 18.04):
$ uname -a
Linux <hostname> 4.18.0-25-generic #26~18.04.1-Ubuntu SMP Thu Jun 27 07:28:31 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
редактировать: Вот еще один очень интересный скриншот проблемы.