LINUX.ORG.RU

Скорость анимации в QML на linux (Qt 5.7+)

 ,


0

1

Есть подозрение, что анимация на Linux сломана уже почти год, как минимум с версии 5.7, но по какой-то причине баг еще никто не зарепортил.

Минимальный пример можно взять в QTBUG-59300, на свежих проприетарных драйверах NVidia работает в несколько раз быстрее чем нужно, по остальным видеокартам вопрос.

Upd. Воспроизводится только если воткнуть монитор в вывод на материнке, при подключении напрямую к видеокарте все работает хорошо.

★★★★★

Скачал пример с суффиксом _2 - белое окошко и всё. При клике начинает в консоль сыпать числа в районе 1000.

Что там должно быть?

UPD: у меня 5.6.2

RazrFalcon ★★★★★ ()
Последнее исправление: RazrFalcon (всего исправлений: 1)

Из чуйства солидарности, запустил, завотил. Второй архив не запахал, первый работает. Зеленый квадратик, инкремент гораздо чаще чем раз в секунду, действительно как-то быстрее чем надо, версия 5.7.0. Проблема есть.

I-Love-Microsoft ★★★★★ ()

archlinux qt 5.8.0

cкорость анимации в норме на 1 архиве и числа в райное 1000+-20 для _2.

дрова intel{Intel HD 4000}(1:2.99.917+757+g93942b7d) & nvidia{NVIDIA Corporation GF108M [NVS 5400M]}(378.13-2) через primusrun

запускал из qtcreator и из консольки(QML_DISABLE_DISK_CACHE=1 ./AnimationsSpeedLinux и QML_DISABLE_DISK_CACHE=1 primusrun ./AnimationsSpeedLinux)

Что-то должно было пойти не так ?

dhampire ★★★ ()
Последнее исправление: dhampire (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Скачал пример с суффиксом _2 - белое окошко и всё. При клике начинает в консоль сыпать числа в районе 1000.

Это норма. Должно быть пустое окошко, но если баг проявляется, то значения будут сильно меньше 1000.

CrossFire ★★★★★ ()
Ответ на: комментарий от dhampire

Что-то должно было пойти не так ?

У меня числа в районе 300 пока анимация работает, но как заканчивает, то возвращаются к 1000, причем в момент окончания анимации число прыгает примерно к 2000.

...
qml: 320
qml: 317
qml: 316
qml: 317
qml: 317
qml: 2003
qml: 1000
qml: 999
qml: 1000
...
CrossFire ★★★★★ ()
Последнее исправление: CrossFire (всего исправлений: 2)

Как это запустить?

Deleted ()
Ответ на: комментарий от I-Love-Microsoft

Второй архив не запахал

В консоль ничего не сыпется?

Зеленый квадратик, инкремент гораздо чаще чем раз в секунду, действительно как-то быстрее чем надо, версия 5.7.0. Проблема есть.

Там анимация на 20 секунд, если выполнилась быстрее, о чем будет написано в консоли, то проблема есть. По скорости инкремента ничего сказать нельзя.

CrossFire ★★★★★ ()
Ответ на: комментарий от Deleted

Как это запустить?

Открыть .pro в QtCreator и нажать зеленую стрелочку в левом нижнем углу.

CrossFire ★★★★★ ()

Первое:

qml: Real animation duration: 19970
qml: Real timer duration: 19970
Deleted ()
Ответ на: комментарий от Deleted

Второе:

qml: 1013
qml: 986
qml: 999
qml: 1014
qml: 999
qml: 999
qml: 1000
qml: 999
qml: 986
qml: 1000
qml: 999
qml: 1000
qml: 1000
qml: 999
qml: 1000
qml: 999
qml: 999
qml: 1000
qml: 1013
qml: 999
qml: 1000
qml: 1000
qml: 999
qml: 1000
qml: 999
qml: 1000
qml: 1000
qml: 999
qml: 1000
qml: 987
Deleted ()

There are two possible contributions to this topic.

The animation system is, for the case of 'threaded' and 'windows' render loops tied to vsync, rather than actual time, so that means that animations will run on its own time, which is close to, but not exactly the same as Date's current time. For animations that spin for a very long time, the animation system and current time, as reported by Date, are expected to drift apart. This is intentional there are no plans to change this. Timer is driven by the Animation system, so it is subject to the same drift.

If 'threaded' or 'windows' render loops are used and buffer swapping is not vsync blocked, then animations will tick as fast as the rendering is able to push out frames. Say a frame completes in 10 ms, well, then animations will advance with 16ms every 8ms, and thus complete a presumed 1 second cycle in 500ms. This is a bit unfortunate, but also a symptom that your system / application is not running optimally as you are in fact rendering two times as fast as your screen can display content, and you should fix your system by enabling blocking vsync.

When using 'basic' render loop, animations and Timer are both driven based on Qt Core timers, which are close to, but also not exactly the same as, actual time. However, these timers are not expected to drift over time, as the vsync based times are.

CrossFire ★★★★★ ()
Последнее исправление: CrossFire (всего исправлений: 1)

Ты пишешь что должно быть воткнуто в мат плату а не в саму материнку, не представляю как это. У меня проблема наблюдается как раз на проп драйвере и DVI-D прям в HDMI разъем видеокарты торчит.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Ты пишешь что должно быть воткнуто в мат плату а не в саму материнку, не представляю как это.

Не во всех материнских платах есть видеовыход, но на современных чаще всего есть, потому что большая часть процессоров сегодня выпускается с интегрированным видеоядром.

Но как оказалось суть не в этом, суть в отсутствии вертикальной синхронизации, чтобы пофиксить в своей программе достаточно добавить одну переменную окружения в main.cpp

qputenv(«QSG_RENDER_LOOP», «basic»);

CrossFire ★★★★★ ()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от CrossFire

Ясно, лучше если пофиксят в самом Qt чтоб без костылей. Не то что бы мне это надо, просто кутятная солидарность :)

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Не пофиксят, они не считают что это баг, и по дефолту скорость анимации привязана к выводу кадров на экран, а не к системному таймеру.

CrossFire ★★★★★ ()
Ответ на: комментарий от CrossFire

Скорость вывода анимации и частота таймера - разные вещи, или мне кажется? Таймер может использоваться для логики, а выводит хоть путь 15 fps.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Скорость вывода анимации и частота таймера - разные вещи, или мне кажется?

The animation system is, for the case of 'threaded' and 'windows' render loops tied to vsync, rather than actual time ... Timer is driven by the Animation system, so it is subject to the same drift.

CrossFire ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.