（観察結果） MapLibre（v2.2.0-pre.2.）での3次元表示（Terrain 3D）でブラウザのメモリ使用量が増えすぎた

# はじめに
## この記事について
MapLibre（v2.2.0-pre.2.）での3次元表示（Terrain 3D）を試していたら、私のウェブ地図は動作が重いようで、ウェブブラウザのメモリ消費量がとても増えてしましました。
**結局、原因はわからなかったのですが、観察結果についてここにまとめておきます。（他に同じ経験をされた方はいるのだろうか？？）**

**私の地図の書き方が良くないのかもしれませんし、必ずしも地図ライブラリに原因があるという訳ではないと思います。この記事の趣旨は上手く行かなかった経験をメモしておく、というものです。**

## 経緯
[前回の記事](https://qiita.com/T-ubu/items/dc5022e15f2b770429b3)で、ALOSの30メートルDEMを使って四国あたりのRGB標高タイルを作りました。

そのRGBタイルに、国土地理院の標準タイルと、日本シームレス地質図WMTS配信サービスを重ねあわせて3D Terrain画像を作っています（MapLibre GL JSをつかった）。
![2022-05-31-地質.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/b46be189-0ae3-e8c8-336d-5b71ab6b8c3c.png)
https://ubukawa.github.io/shikoku/map-3.html#8/34.034/134.234/0/52


ところが、このMapLibreの3D 地図はシーンや縮尺を変えて、いろいろな場所でしばらく見ていると、Google クロムの使用メモリがどんどん増えていき、地図の動きが重くなり、場合によっては止まることがありました。Microsoft Edgeでもメモリ使用量が大きくなる。そこで何が問題なのかと、いろいろと比べてみました。
![2021-05-31-memory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/593a676d-5bd3-f2df-7377-4c2f8a488e9f.png)

# わたしの環境
* Mapbox GL JS ver. 2.6.1
* MapLibre GL JS ver. 2.2.0-pre.2.
* Google Chrome Version 102.0.5005.63 (Official Build) (64-bit)

# 比較
## 試行1：　optgeo/nagi-viでMapbox GL JS とMapLibre GL JSの比較
### 準備
hfuさんが作られた[optgeo/nagi-vi](https://github.com/optgeo/nagi-vi)のテンプレートから自分のレポジトリを作ります。このレポジトリにあるウェブ地図では、国土地理院の標高タイルを使って、国土地理院の航空写真データなどを表示しています。
![2022-05-31-test01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/ffe48841-e617-16a2-1540-973e026cca52.png)

つくったレポジトリはここ　https://github.com/ubukawa/nagi-vi-test


* Mapbox GL JSの方は、module.jsにあるTokenを自分のものに変えておきます。
* optgeo/nagi-viには、MapLibre GL JSでのWeb地図はないので、index-maplibre.html,  module-maplibre.js, style-maplibre.jsonを作っておきます。ほとんどmapboxのものと同じ書きぶりで大丈夫です。MapLibre GL JSは Tokenはいりませんが、maxPitchを指定しないとある程度までしか傾けないのでmaxPitchを指定しておきます。また、MapLibreではskyのレイヤを作れないと思いますので、それは入れていません。
![2022-05-31-test02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/33c1e732-2d17-c22b-96a5-3114a383f147.png)

### 比較1
こちらがMapboxでの画面です。右にクロムのメモリ使用量があります。
![2022-05-31-test03-mapbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/7e1980dc-78c1-7b61-77aa-8539e4a7ba58.png)

こちらがMapLibreでの画面です。右にクロムのメモリ使用量があります。
![2022-05-31-test03-maplibre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/fbe0f9a4-e88a-d656-dc8b-fe18945a3227.png)

メモリは一度増えた後、だんだん下がって500～700MBで安定するのですが、このシーンだけではどちらも1,000 MBは超えませんでした。
ただし、MapLibreとMapBoxでは、手前のシーンと向こうのシーンの縮尺レベルの切り替わり方、あるいはシーンの切り目が微妙に違うようです。富士山の山頂の雪のあるなしで違いがみえますね。

### 比較2
上と同じことを別の地域でたしかめました。やはりシーンの切れ目について2つのライブラリで違うがありますが、使用メモリはさほど増えませんでした。nagi-viのスタイルの作り込みが優秀なのでしょうか？？

こちらがMapboxでの画面です。右にクロムのメモリ使用量があります。
![2022-05-31-test04-mapbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/5a2c1b6e-b41f-e5a0-a5ed-f8d1b428090d.png)

こちらがMapLibreでの画面です。右にクロムのメモリ使用量があります。
![2022-05-31-test04-maplibre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/55bda20d-334b-955c-b433-15118c6d0321.png)


## 試行2： optgeo/nagi-viで遠くをぼやけさせる効果を見てみる
nagi-viには、工夫があって、module.jsのなかでeasingというものを使っているようです。見る角度によって、フォーカスしていないところをぼかすような仕組みです。（つまり遠くの方ははっきり見えない）
https://github.com/optgeo/nagi-vi/blob/main/docs/module.js#L52-L101

これが使用メモリの節約に影響を与えているのだろうか？？と考えて、あるものとないものを作って比べてみました。

MapLibreでeasingあり。
![2022-05-31-test05-maplibre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/8e190926-d894-2e2e-64f4-ba695d46c669.png)

MapLibreでeasingなし。
![2022-05-31-test05-maplibre0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/ca4e2a91-e70b-701b-b5bd-a7a59697614f.png)

結局、どちらもあまりメモリ使用量は変わりません。これではないみたいです。

## 試行3：　影の影響か、optgeo/nagi-viで調べる。
どうしてnagi-viはメモリの使用量が大丈夫なのだろうと考えて、こんどは影（hillshade）かもと思いつきました。
MapLibreを使って、影があるものと無いものを比べてみます。

航空写真に影があるのか、影の雰囲気がありますが、Hillshadeがないもの。
![2022-05-31-test06-maplibre0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/5bc2a6d7-8b4f-7f01-8c1e-3e45889bfb10.png)

上から少しだけ地域がずれていますが、Hillshadeを加えたもの。
![2022-05-31-test06-maplibre00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/02ec1058-9802-6ae1-dfc5-ed25fbb6fd78.png)

しかし、結局、どちらもあまりメモリ使用量は変わりません。これではないみたいです。

## 試行4： optgeo/nagi-vi以外の地図で比べて見る。
nagi-viのウェブ地図ではMapLibreの地図のメモリが増えると言うことはなかったので、私が作ったレポジトリでも比べてみます。

下のMapLibreの地図 https://ubukawa.github.io/shikoku/map-3.html ではシーンを変えたりして見ていると、メモリ使用量が5,000MBを超えてしまうこともあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/63c55b78-a21c-ae00-fe5e-8b166ebf499f.png)

一方、同じようなコンテンツをMapbox GL JSでみると、どういうことか、メモリ使用量は 1,500MB を下回っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/8e38a1fb-7d15-5599-14c6-a3c5ec58da9f.png)



# まとめ
結局、どうしてMapLibreでブラウザのメモリ使用量が増大するのかわかりませんでした。
私がつくるウェブ地図だとメモリが増えすぎることがあるのでちょっと困りました。
![2022-05-31-test07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/9c237f6b-c259-8c74-9522-60d7085d6a9a.png)

# 謝辞
MapLibreの3次元表示の開発に関わられた皆様に心より感謝します。
また、optgeo/nagi-viを開発された@hfuさんに感謝します。

# References:
* レポジトリ
    * optgeo/nagi-vi(template) https://github.com/optgeo/nagi-vi
    * My test repository from nagi-vi https://github.com/ubukawa/nagi-vi-test
    * Other 3D terrain map repository https://github.com/ubukawa/shikoku
* （簡単）Dockerを使ってAW3D30 (ALOS World 3D - 30m) からRGB標高タイルをつくる　https://qiita.com/T-ubu/items/dc5022e15f2b770429b3
* 日本シームレス地質図WMTS配信サービス https://gbank.gsj.jp/owscontents/contents/seamless200k.html