PNG版標高タイルの利用

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