Android: производительность «хиты» в приложении живые обои - PullRequest
1 голос
/ 10 декабря 2011

У меня возникли проблемы с приложением живых обоев, которое я пишу.

Я использую OpenGL 1.0 для рендеринга. В целом, производительность, которую я получаю, довольно приличная. На Samsung Galaxy S2 (2.3.4) я могу получить 60 FPS без ограничения кадра.

Однако время от времени я получаю некоторые кадры, которые значительно больше других (скажем, нормальный кадр составляет 33 мс, а всплеск составляет около 70-100 мс). Это происходит через равные промежутки времени, примерно раз в секунду.

Мой код выполняет одинаковую обработку каждого кадра, поэтому это ненормальное поведение. Похоже, что мой поток по какой-то причине обменивается / задерживается или просто виртуальная машина начинает работать медленнее в какой-то момент.

Замедления не связаны с обработкой на GPU, так как eglSwapBuffers никогда не ждет. Я также почти уверен, что мой процесс не заставляет GC работать, потому что я стараюсь, чтобы в моем цикле не было недолговечных объектов (проверено в трекере распределения DDMS).

Интересно то, что если я держу палец на экране, то всплески во времени кадра, как правило, становятся значительно меньше. Как будто ОС повышает приоритет процесса из-за этого.

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

Кто-нибудь еще испытывал такую ​​же проблему? Любые намеки на то, что может быть причиной проблемы, также будут высоко оценены.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

То, что вы описываете, звучит как долгий сбор мусора, передаваемый мне.[EDIT] Вы упоминаете, что сократили свои ассигнования - возможно, есть другое приложение или библиотека, которая вызывает всплеск?

Произойдет переключение контекста потока, но если вы не очень близки к пределу в терминахиспользования процессора (т. е. вы используете 16 мс мощности процессора на кадр), тогда это не будет вашей проблемой.В настоящее время вы почти наверняка ограничены частотой переключения кадрового буфера графического процессора (максимум 60 переключателей в секунду).

Я бы также сказал, что живые обои обычно должны иметь возможность ограничивать частоту обновления до 15 кадров в секунду.Аккумулятор - это фактор, который вы должны серьезно рассмотреть для живых обоев.

0 голосов
/ 14 декабря 2011

Похоже, вы правы. Как живые обои вы не должны быть единственным активным потоком, поэтому всякий раз, когда другое приложение должно делать свое дело, вы будете получать задержки. Насколько я знаю, вы не можете это контролировать. В одном из моих приложений хуже всего, когда я получаю электронное письмо, где я замираю на полсекунды. В вашем случае регулярные интервалы заставляют меня думать, что другой процесс проверяет что-то каждую секунду или около того. Иногда в logcat появляются подсказки, и каждый раз появляется повторяющийся процесс.

У меня нет решения для этого, но то, что немного помогает (в зависимости от характера вашей анимации - и это предполагает, что вы анимируете, используя каждый кадр в качестве временного шага, извините, если нет), это использование фактического время, прошедшее между последним и текущим кадрами. Любой всплеск «замораживает» дисплей, но не анимацию. Это тонко, но иногда этого может быть достаточно.

...