Skip to content

soukouki/CityView

Repository files navigation

Simutrans CityView

Simutrans CityViewとは、Simutransの画面を撮影し、ブラウザから自由に閲覧できるようにするツールです。

デモサイト

https://cityview.sou7.io

CityViewの特徴

  • 利用者はブラウザでサイトを開くだけでマップを見学できます。
  • 地図表示ライブラリによってとても快適な操作感を実現します。
  • 事前に地図タイルを生成するため、アクセス時のサーバー負荷は低いです。
    • 代わりに地図タイル生成は高負荷で時間もかかります。
  • 複数マップをホスティング可能です。
    • 同じマップを年代を切り替えて表示できます。
    • 同じ地点で年代ごとの発展の様子を見られます。
  • Extended板, OTRP板に対応しています。
    • Standard板も対応予定です。

CityViewの仕組み

w:400 SimutransをDockerコンテナで起動し、スクリーンショットを撮影

w:400 スクショ位置はかなり誤差があるので、位置合わせをする

w:400 地図描画ライブラリ向けに、正方形のタイルに切り出す※

※実際にはタイルをまとめてより低ズームレベルの画像を生成したり、画像の圧縮を行ったりしています。

あなたもCityViewを使ってみませんか?

ローカルで開発しているマップや、NS鯖のマップをCityViewで公開してみませんか?

必要なマシン

Linuxマシンを推奨します。

原理的にはDockerが動けば他のOSでも良いですが、ただでさえ重い地図タイル生成が更に重くなってしまいます。

メモリは設定次第ですが、最低8GBあれば動くと思います。16GBあるとよく、32GBあると安心です。

CPU処理が重いので、できればコア数が多いと良いです。6コア12スレッドのマシンでも、熊谷マップ(1280x640)の等倍撮影で40分程度かかりました。

SSDを推奨します。

GPUは必要ありません。

手順

  1. Docker・Docker Compose・Gitをインストール
  2. git clone https://github.com/soukouki/CityView.gitを実行
  3. .env.sampleファイルをコピーして.envファイルを作成し、設定を編集
    • 処理の並列度を指定できるので、CPU性能に合わせて調整してください
  4. sudo docker compose up -d --buildを実行
  5. 以下の画面にアクセス
    • http://localhost:8000: マップ閲覧画面
    • http://localhost:8001: 管理画面
    • http://localhost:4200: Prefectのダッシュボード マップ作成の様子を見守る用
  6. volume-binフォルダにSimutransの一式を配置
    • Linux向けの実行ファイルを配置し、chmod u+x <実行ファイル>で権限を設定することを忘れずに
    • volume-bin以下をいい感じに探索するので、サブフォルダに入れてもOK
  7. 管理画面でマップを追加
  8. 数分〜数時間待つとマップの生成が終わるので、それまでPrefectのダッシュボードのRunsを開いて進捗を見守る
  9. Completedになればマップ閲覧画面でマップが見られるようになる

パラメータ設定の勘所

.envの設定

.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)による画像認識技術)を使い、マップの見どころを自動的に検出・生成したいです。

About

A system for viewing Simutrans maps from the web

Resources

License

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors