Simutrans CityViewとは、Simutransの画面を撮影し、ブラウザから自由に閲覧できるようにするツールです。
- 利用者はブラウザでサイトを開くだけでマップを見学できます。
- 地図表示ライブラリによってとても快適な操作感を実現します。
- 事前に地図タイルを生成するため、アクセス時のサーバー負荷は低いです。
- 代わりに地図タイル生成は高負荷で時間もかかります。
- 複数マップをホスティング可能です。
- 同じマップを年代を切り替えて表示できます。
- 同じ地点で年代ごとの発展の様子を見られます。
- Extended板, OTRP板に対応しています。
- Standard板も対応予定です。
ローカルで開発しているマップや、NS鯖のマップをCityViewで公開してみませんか?
Linuxマシンを推奨します。
原理的にはDockerが動けば他のOSでも良いですが、ただでさえ重い地図タイル生成が更に重くなってしまいます。
メモリは設定次第ですが、最低8GBあれば動くと思います。16GBあるとよく、32GBあると安心です。
CPU処理が重いので、できればコア数が多いと良いです。6コア12スレッドのマシンでも、熊谷マップ(1280x640)の等倍撮影で40分程度かかりました。
SSDを推奨します。
GPUは必要ありません。
- Docker・Docker Compose・Gitをインストール
git clone https://github.com/soukouki/CityView.gitを実行.env.sampleファイルをコピーして.envファイルを作成し、設定を編集- 処理の並列度を指定できるので、CPU性能に合わせて調整してください
sudo docker compose up -d --buildを実行- 以下の画面にアクセス
http://localhost:8000: マップ閲覧画面http://localhost:8001: 管理画面http://localhost:4200: Prefectのダッシュボード マップ作成の様子を見守る用
volume-binフォルダにSimutransの一式を配置- Linux向けの実行ファイルを配置し、
chmod u+x <実行ファイル>で権限を設定することを忘れずに volume-bin以下をいい感じに探索するので、サブフォルダに入れてもOK
- Linux向けの実行ファイルを配置し、
- 管理画面でマップを追加
- 数分〜数時間待つとマップの生成が終わるので、それまでPrefectのダッシュボードの
Runsを開いて進捗を見守る Completedになればマップ閲覧画面でマップが見られるようになる
.envファイルでは、タイムゾーンやCloudflare Tunnelのトークン設定の他に、以下のような設定があります。
- TILE_SIZE
- 地図タイルの1辺のピクセル数を指定します。512から変更する必要はあまり無いと思います。
- SERVICE_CAPTURE_REPLICAS
- スクリーンショット撮影サービスのコンテナのレプリカ数を指定します。シムトランスを起動するだけですでにかなり重いので、ここはあるていど控えめに設定することを推奨します。コア数の1/3が目安なんじゃないかと思います。
- SERVICE_CAPTURE_WORKERS_PER_REPLICA
- スクリーンショット撮影サービスの各レプリカ内での並列度を指定します。Simutrans本体の起動はコンテナ1つにつき1つだけですが、撮影・クリッピング部分の並列化が可能です。
- とはいえ、再描画待ち時間の兼ね合いもあるので、あまり大きくしても効果は無いです。4くらいで良いと思います。
- SERVICE_ESTIMATE_REPLICAS
- 位置合わせサービスのコンテナのレプリカ数を指定します。位置合わせは一瞬で終わるので、あまり大きくする必要は無いです。
- SERVICE_TILE_CUT_REPLICAS
- タイル切り出しサービスのコンテナのレプリカ数を指定します。タイル切り出しはかなり重いので、コア数と同じくらいにするのが良いと思います。
- SERVICE_TILE_MERGE_REPLICAS
- タイル結合サービスのコンテナのレプリカ数を指定します。タイル結合はそこまで重くないので、あまり大きくする必要は無いです。
- SERVICE_TILE_COMPRESS_REPLICAS
- タイル圧縮サービスのコンテナのレプリカ数を指定します。タイル圧縮はそこまで重くないので、あまり大きくする必要は無いです。
- SERVICE_CREATE_PANEL_REPLICAS
- パネル作成サービスのコンテナのレプリカ数を指定します。パネル作成タスクは6個しかないので、あまり大きくする必要は無いです。
- CONCURRENCY_ALL
- CPU使用率が100%に張り付くとスクリーンショット撮影に失敗することがあります。全体の並列度をコア数程度に抑えるためのパラメータです。
- ズームレベル
- 大きいマップの場合は、2倍撮影を控えて等倍、2分の1倍撮影にすることで、撮影時間を大幅に短縮できます。
- 目安として、Ryzen 5 8600G、等倍撮影、マップサイズ2529x2484、再描画待ち時間1秒の設定で撮影したところ、42分かかりました。
- 移動タイル数 (DELTA)
-
$(0,0), (\delta/2, \delta/2), (0, \delta), \dots$ といったふうに撮影が行われます。 - 基本は推奨値そのままで良いと思います。
- DELTAを大きくすると撮影回数が減るので、位置照合が成功しやすくなります。
- DELTAを小さくすると画像のサイズが小さくなるので、撮影時間が伸びる代わりにメモリ使用量が減ります。
- DELTAを大きくしすぎて撮影幅が大きくなると、ゲームの起動に失敗することがあります。体感として、幅10000pxを超えると失敗しやすい気がします。
-
- 再描画待ち時間
- 縮小して大きな範囲を写したり、熊谷半島や横瀬地峡のように極端にマップ上の物が多い場合には、Simutransの動作がカクカクになって再描画に時間がかかるようになります。
- 迷ったら少し大きめの値を設定しておけばよいです。
- 糊代の割合 (%)
- スクリーンショットを撮ると、指定した座標が画面の上下左右にズレます。このズレを吸収するのが糊代です。
- 例えば5%と指定すると、上側に有効高の5%、下側に有効高の5%、左側に有効幅の5%、右側に有効幅の5%が確保されます。
- 仮に10%とすると、有効範囲の1.44倍の範囲の撮影が行われます。このように糊代を増やすとすごい勢いで撮影効率が減ってしまいます。しかしながら、これを減らすと画像間に隙間が生まれ、きれいなマップになりません。調整が必要です。
- Prefectの動作が不安定です。Flow Runの様子を見守ってあげたり、場合によってはConcurrencyの値を調整したりしてください。
NSに繋げた本体を用意し、ズーム時に秒間1フレーム程度でリアルタイムな地図タイルを生成・閲覧したいです。
地下表示モードでも撮影し、地下鉄などの様子も見られるようにしたいです。
駅名や都市名、列車の系統表示などのラベルをOCRで検出し、検索したり、その他の形で活用したいです。
ただし、スクショ画像をそのまま使うとOCRが上手く動かないので、ラベル部分を切り出してからOCRにかけるなどの工夫が必要です。
VLM技術(今流行りのAI(LLM)による画像認識技術)を使い、マップの見どころを自動的に検出・生成したいです。


