Пользовательская карта на основе плитки работает медленно - PullRequest
3 голосов
/ 02 декабря 2010

Я работаю над картой для моего приложения общественного транспорта.Я использую SurfaceView, это карта на основе плиток, кроме основного потока есть два потока - поток рисования и поток загрузки растровых изображений.

Растровые изображения - это 256x256 PNG-файлов, хранящихся на SD-карте, я кеширую загруженные растровые изображенияемкость кеша составляет 64 битмапа.Существуют различные наборы растровых изображений для каждого уровня масштабирования, моя карта имеет 4 уровня масштабирования, каждый следующий уровень в 2 раза больше.

К сожалению, прокрутка и масштабирование пинч не работают на Nexus One, FPS составляет 15 - 20Когда никакие плитки не загружаются, FPS равен 35 - 40. Если я понижаю приоритет потока загрузки растрового изображения, он становится полностью плавным, но я часто вижу на карте еще не загруженные (белые) плитки - что еще хуже, чем негладкость.

Так что я мог сделать?Пока у меня есть 2 идеи:

  • Попробуйте OpenGL, но я не хочу тратить на это время, а потом узнаю, что мой FPS только увеличен на 3. Также я хочу показать всплывающие окна (чтопрокрутка с картой) после того, как пользователь нажимает на маркеры карты, что я не знаю, как это сделать в GLSurfaceView.
  • Устанавливать низкий приоритет для потока загрузки растровых изображений только тогда, когда пользователь касается экрана или во время продолжающейся анимации.Я попробовал это, но по неизвестной причине это, казалось, даже усугубило проблему, касаясь / не касаясь экрана, не имело никакого эффекта.Если бы это была какая-то ошибка, которую я могу исправить, есть еще одна проблема.Если я использую кинетическую прокрутку для быстрого перемещения карты, я увижу много не кэшированных растровых изображений.

1 Ответ

2 голосов
/ 02 декабря 2010

Не делайте любых операций ввода-вывода в потоке рендеринга. (Как вы можете использовать GLSurfaceView и, кстати, не использовать OpenGL?)

Я написал представление карты на основе плиток OpenGL, и оно на Nexus One гладкое, как масло (не измеряет частоту кадров в секунду, но легко так же гладко, как приложение карт на iPhone 4). Хитрость заключается в том, чтобы переместить все операции ввода-вывода из потока рендеринга, понизить приоритеты ваших рабочих потоков и немедленно запросить requestRender () в конце текущего рендеринга, если вы знаете, что потребуется другой (например, при панорамировании или zoom), т.е. не ждите, пока другой поток не сообщит об этом. Ищите Yell.com на Маркете, чтобы увидеть его в действии (хотя может быть только в Великобритании).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...