Androidアプリで使用している地理院標高タイルを,テキスト形式からPNG形式に変更したときの性能の話
拙作のAndroidアプリ 地図ロイド には3D地形表示機能がありますが,
ここで国土地理院の 標高タイル を使わせていただいています.
今まではテキスト形式を使っていたのですが,PNG形式も使えるようになっているとのことで,
早速試してみました.
地理院地図|標高タイルの詳細仕様
ファイルサイズが小さくなる(約1/4)ため,ダウンロード時間の短縮による性能改善が見込めます.
実装例
PNG版標高タイルのデコード例.AndroidのJava
Bitmap bmp = [ダウンロードしたPNGから生成したBitmap]
int width = bmp.getWidth();
int height = bmp.getHeight();
int pixels[] = new int[width * height];
bmp.getPixels(pixels, 0, width, 0, 0, width, height);
for (int i = 0; i < pixels.length; i++) {
int v = pixels[i] & 0x00FFFFFF;
int alt; // 整数として使う例
if (v < 0x00800000) {
alt = v / 100;
} else if (v == 0x00800000) {
alt = [無効値を表すような値];
} else {
alt = (v - 0x01000000) / 100;
}
~altを保存したりして使う~
}
性能の比較
通信環境,端末の性能に依存するので値そのものに意味はないのですが,
手元のXperia Z5 Compactではこんな感じでした.
タイル1枚あたりのおよその所要時間です.
▼ TXT版
ダウンロード: 0.05
デコード: 0.5
合計:0.55 秒
▼ PNG版
ダウンロード: 0.04
デコード: 0.03
合計:0.07 秒
考察
-ダウンロード時間は短縮される.どれだけ変わるかは通信環境によると思います.
-デコード時間が大幅に短縮していますが,これはTXT版がJavaのString#split()でテキストを行(\n)と列(,)に分割するだけの簡素な作りで,性能はいまいちだったため
TXT形式で,CSVのデコード処理を単純にString#split()で実装している程度でしたら,このぐらいの違いが出そうです.
CSVのデコード処理をC++等でカリカリに高速化していた場合でも,
ダウンロードサイズが減るのは通信量の削減につながりますので,やった方が良い気がします.
今回のようにAndroidの場合は特に.