Почему setInterval (, 0) делает анимацию намного более плавной в NativeScript? - PullRequest
1 голос
/ 27 сентября 2019

Я работаю над пользовательской анимацией (мигание экрана со скоростью 60 кадров в секунду) на Android, и я был очень удивлен, что использование глупых setInterval(() => {...}, 0) работает намного лучше, чем хореограф нативного андроида.

С setInterval(() => {...}, 0) У меня стабильные 60 FPS даже на устройствах с Android 5, но с помощью Choreographer (это должно работать намного эффективнее, код ниже) я получил снижение до 50 FPS на мощном OnePlus 6 на Android 9.0

android.view.Choreographer.getInstance().postFrameCallback(...);

Но если я напишу setInterval(() => null); рядом с определением обратного вызова Choreographer - я достигну стабильного FPS и низкого использования графического процессора (LOL, верно?).

Поэтому я создал приложение на детской площадке, где каждый может его протестировать.Включите «Профиль GPU рендеринга» - «На экране в виде полос» в меню «Параметры разработчика» и запустите это простое приложение с простым загрузчиком на 2 страницах - одна с абсолютно пустым компонентом, другая с setInterval(() => {}, 0)

https://play.nativescript.org/?id=yRTcJk&v=1

Как результат - пустой компонент рендерит загрузчик со скоростью 58-60 FPS с полным использованием графического процессора (до 60 кадров в секунду), , но в компоненте с пустым setInterval - стабильный 60 FPS и 1/ 3 способа использования 60FPS.

Кто-нибудь может сказать, что происходит?

UPD: добавлены GIF (второй - с setInterval(() => null);)

Loader with empty component Loader with empty setInterval(,0) in component

...