Я создаю приложение 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
x11 детали:
$ 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
edit: Вот еще один очень интересный скриншот проблемы.