Некоторые устройства Android чрезвычайно медленны при рендеринге элементов холста
Я разрабатываю приложение для устройств Android и обнаружил, что samsung galaxy S4 специально имеет чрезвычайно низкую производительность, когда приложение/веб-страница использует холст.
Странно, что это не всегда так.
Я тестировал 2 примера приложений.
http://ie.microsoft.com/testdrive/Performance/FishIETank/Default.html
и
http://ie.microsoft.com/testdrive/Graphics/TouchEffects/Default.html
первый работает отлично и превосходит мою Nokia (которая является двухъядерной) и ожидается. Однако другая демонстрация почти полностью не реагирует, а частота кадров близка к 1, где, как и все другие устройства, они отлично выглядят.
Так как первое приложение работает хорошо, а другое - нет, оно задает вопрос, почему?
У первого нет прослушивателей событий, где, как и у других, есть прикосновения слушателей. Могло бы прикоснуться к делу, а не к холсту... или это демонстрация, использующая некоторые функции холста, которые другие нет, и, следовательно, имеет низкую производительность.
Я прочитал много тем об этой проблеме, и ни у кого нет ответа. Большинство из них много месяцев... так что я думал, что плохо сделаю новую тему.
Есть ли способ решить проблему с холстом на Samsung S4... и, возможно, другие устройства Android, работающие на 4.2.x.
Если у пользователей StackOverflow есть S4, можете ли вы протестировать обе демоверсии и подтвердить мои наблюдения?
Ответы
Ответ 1
Я сильно подозреваю, что это не проблема с Canvas, а проблема requestAnimationFrame
. Первая анимация не пытается использовать requestAnimationFrame
, но вторая делает в этот файл на line 206
.
Android-браузер на прошивках <= 4.2 не поддерживает requestAnimationFrame
и вместо этого использует setTimeout
, разделяя одну секунду на заданную частоту кадров в Гц, которая выполняет рендеринг в обычном цикле событий.
setTimeout
не выполняется в точечное время в миллисекундах, но завершает событие в цикле в указанное время. Если цикл события висит на другом javascript на странице, или одноядерное устройство решает, что что-то еще более важно, среда выполнения очень уязвима для де-приоритезации без API requestAnimationFrame
, а обратные вызовы в очереди с использованием setTimeout
будут заикаться и сгущаться. Подробнее о setTimeout
разрешении и времени.
К сожалению, вы находитесь на милость очереди событий, если вы (1) собираетесь использовать этот подход на основе Canvas и (2) на платформе, которая не поддерживает requestAnimationFrame
. Вот справочная таблица, для которой браузер поддерживает эту функцию.
Ура!