Некоторые устройства 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, можете ли вы протестировать обе демоверсии и подтвердить мои наблюдения?

Solutions Collecting From Web of "Некоторые устройства Android очень медленны при рендеринге элементов холста"

Я сильно подозреваю, что это не проблема с Canvas, а проблема requestAnimationFrame . Первая анимация не пытается использовать requestAnimationFrame , но вторая делает в этом файле в line 206 .

Android Browser на прошивках <= 4.2 не поддерживает requestAnimationFrame и вместо этого использует setTimeout , делящий одну секунду на заданную частоту кадров в Гц, которая выполняет рендеринг в обычном цикле событий.

setTimeout не выполняется в точечное время в запрошенных миллисекундах, но завершает событие в цикле в указанное время. Если цикл события зависает на другом javascript на странице, или одноядерное устройство решает, что что-то еще более важно, среда выполнения очень уязвима для де-приоритезации без API requestAnimationFrame , а обратные вызовы, запущенные с помощью setTimeout будут заикаться и сжиматься , Подробнее о разрешении и времени установки setTimeout .

К сожалению, вы находитесь во власти очереди событий, если вы находитесь (1), используя этот подход на основе Canvas и (2) на платформе, которая не поддерживает requestAnimationFrame . Вот справочная таблица для того, какие браузеры поддерживают эту функцию.

Ура!