Регулирование FPS (?) - Как сделать цикл обновления / отрисовки телефона более плавным? - PullRequest
3 голосов
/ 15 мая 2011

Я создаю приложение для телефона Android и испытываю странное «удушение».Я полагаю, что это потому, что семафор вызывается, чтобы остановить то, что приложение делает для обработки чего-то еще в телефоне.Хотя я не уверен в этом.

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

Редактировать: некоторая дополнительная информация, с которой я в данный момент работаю, - это двумерный массив изображений - только около 80 рисуется во время экземпляра ~ 8000.Они рисуют, только если их цветовой оттенок не RGB0 (черный цвет).Цикл выполнения в обновлении проверяет, какие изображения находятся ближе всего к плееру, и дает им базовое минимальное освещение RGB 0.2f.Кроме этого, в обновлении есть основные обработчики событий и циклы перемещения / просмотра порта.Обратите внимание, что я использую фреймворк Libgdx, а не Android.Так что OpenGL и т. Д. И т. Д.

Редактировать: я хотел бы отметить, что проблема не в том, что вы думаете, что будет.Я отправлял вектор2 примерно в 3800 раз, но не просто «отправляю», а объявляю новый Вектор2 и отправляю параметры таким образом.КОЛЛЕКТОР МУСОРА НЕ БЫЛ УДЕРЖИВАТЬ ЭТО ЗЛОТСТВО.Работает гладко, теперь, когда я посылаю только 2 поплавка.Мой плохой ._.

Ответы [ 2 ]

4 голосов
/ 15 мая 2011

Если не работает несколько активных процессов одновременно, этого не должно происходить.

Я предполагаю (не видя код), что сборщик мусора работает слишком много. Вы инициализируете объекты в цикле? Если да, можете ли вы использовать объекты вместо этого?

Объектами может быть что угодно, особенно Views. Убедитесь, что вы повторно используете ваши представления, а не создавать новые.

Еще один момент, который следует учитывать: перерисовка полного макета : можете ли вы перерисовать только часть экрана вместо всего этого? (т. е. используйте view.invalidate(rect); вместо view.invalidate();)

Наконец, ваши макеты слишком глубокие ? Постарайтесь сделать их как можно более плоскими. Например, используйте RelativeLayout вместо вложенного LinearLayouts.

Найдите время посмотреть это видео: Romain Guy's Google I / O 2009 talk . Оттуда можно получить много информации.

После обновления я вижу, что у вас есть 8K изображений для рисования. Если вы создадите все их экземпляры, скорее всего, в памяти мало места для чего-либо еще, поэтому GC нужно будет постоянно собирать все, что может. Это означает замедление всей системы. Проверьте, на том же видео, вопросы и ответы около 53-55 мин. Он предлагает в таких ситуациях, как ваша, иметь все ссылки на растровые изображения в HashMap из мягких ссылок, чтобы GC мог собрать неиспользуемые изображения при необходимости. Это предотвратит сбор чего-либо еще. Я бы также создавал их экземплярами по мере необходимости вместо того, чтобы делать все это в начале.

0 голосов
/ 15 мая 2011

Если вы видите лаги в отрисовке / обновлении пользовательского интерфейса, возможно, вы выполняете какой-то длительный процесс (сеть, база данных, носитель, растровое декодирование) в потоке пользовательского интерфейса.

Вы должны выполнять длительные задачи в фоновая нить .Для этого используйте AsyncTask .

...