Androidアプリで使用している地理院標高タイルを,テキスト形式からPNG形式に変更したときの性能の話

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の場合は特に.

kamolandをフォローしましょう


© 2017 KMIソフトウェア