Как ускорить загрузку/настройку плитки - OSMDROID

Я создаю и устанавливаю новые плитки, начиная с данных гриба, но приложение работает очень медленно:

try {
            gribFileTileSource.setRecord(1);
            for (int j=0;j<tileSize;j++) {
                lat=minLat+j*dLat;
                for (int i=0;i<tileSize;i++) {
                    lon=minLon+i*dLon;
                    //Log.d(LOG_TAG,"lon:"+lon+" lat:"+lat);
                    u=gribFileTileSource.getValue(lat,lon);
                    color=gribFileTileSource.getColor(u);
                    bitmap.setPixel(i,tileSize-j-1,color);
                }
            }

Как сделать этот код быстрее?


person Pasquale Celardo    schedule 12.01.2018    source источник
comment
если ваш провайдер тайлов использует тайлрайтер, он может хранить ваши тайлы в кэше тайлов osmdroid, что должно значительно ускорить его работу.   -  person spy    schedule 13.01.2018
comment
Обычная процедура оптимизации состоит в том, чтобы профилировать и выяснить, где тратится время, и двигаться дальше. Я не знаю, какова ваша структура grib, но хорошая ставка все время находится в getValue (lat, lon). Что вы получаете за каждый звонок?   -  person Ifor    schedule 13.01.2018
comment
можете ли вы получить всю строку файла grib за один раз или, по крайней мере, значение и цвет?   -  person Ian Turton    schedule 13.01.2018
comment
для каждого вызова getValue(lat,lon) я возвращаю индексы фрагмента карты [minLon - minLat] [maxLon - maxLat]   -  person Pasquale Celardo    schedule 15.01.2018


Ответы (1)


Похоже, у вас есть собственный источник тайлов, и вы выполняете рендеринг на лету. Если это так, вам следует взглянуть на поставщика MapsForge, который был адаптирован для osmdroid.

Секретный соус, который поможет, находится в следующем классе: .java#L109" rel="nofollow noreferrer">MapsForgeTileModuleProvider

Этот класс выполняет аналогичную функцию, он отображает тайлы на лету. После рендеринга тайлов они записываются в IFileSystemCache, что может быть на несколько порядков быстрее с помощью SQL, чем рендеринг/производство изображения каждый раз.

Итак, в основном, после того, как вы создали рассматриваемую плитку, сохраните ее в IFileSystemCache#.saveFile(tileSource, pTile, new ByteArrayInputStream(bitmapdata)); или что-то в этом роде (обязательно закройте поток)

После того, как у вас появится возможность генерировать плитки, соедините все вместе с помощью класса, расширяющего MapTileProviderArray. Вот пример для кузницы: https://github.com/osmdroid/osmdroid/blob/master/osmdroid-mapsforge/src/main/java/org/osmdroid/mapsforge/MapsForgeTileProvider.java

Обратите внимание, что он создает MapTileFilesystemProvider, который сначала загружает кэшированный тайл, затем модуль записи тайлов, затем поставщик тайлов (который генерирует тайлы на лету). Затем этот пользовательский массив поставщика плиток карты можно прикрепить к карте с помощью mapView.setTileProvider().

Таким образом, это не ускорит рендеринг тайлов (ну, может, поскольку модуль поддерживает несколько потоков, см. this), но наибольшее влияние на производительность оказывает хранение обработанных листов в кэше файловой системы.

person spy    schedule 13.01.2018
comment
правильно, я создаю пользовательский источник тайлов на лету. Но очень медленно. Сейчас попробую. - person Pasquale Celardo; 15.01.2018
comment
основной класс, которому я должен следовать, это private class TileLoader extends MapTileModuleProviderBase.TileLoader ? - person Pasquale Celardo; 15.01.2018
comment
@PasqualeCelardo только что обновил ответ более подробно - person spy; 15.01.2018
comment
зная ограничивающую рамку плитки, можно ли все это ускорить? можно ли проверить наличие блоков тайла в ячейке гриба? Таким образом, чтобы вместо раскрашивания 256x256 пикселей нужно было раскрашивать только nRows x nCols ячейки гриба - person Pasquale Celardo; 16.01.2018