Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C++でつくる歴史シミュレーションGIS
Search
As Project
February 11, 2024
Programming
0
420
C++でつくる歴史シミュレーションGIS
文献学・考古学・人類学データを用いたABS & GIS
各国・各時代の暦表示機能や各時代の環境復元機能を持つ
XYZタイルや地物を自由に追加することが可能
As Project
February 11, 2024
Tweet
Share
More Decks by As Project
See All by As Project
考古学・人類学・文献学のための次世代GISの開発―時間情報とAgent-based modelの活用―
aspjt
1
180
クソアプリハッカソン 2023
aspjt
0
47
世界を創造するOSS開発を始めた話
aspjt
0
80
Other Decks in Programming
See All in Programming
Enabling DevOps and Team Topologies Through Architecture: Architecting for Fast Flow
cer
PRO
0
330
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
3
690
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
2
350
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.2k
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
14
2.2k
subpath importsで始めるモック生活
10tera
0
310
Jakarta EE meets AI
ivargrimstad
0
580
ピラミッド、アイスクリームコーン、SMURF: 自動テストの最適バランスを求めて / Pyramid Ice-Cream-Cone and SMURF
twada
PRO
10
1.3k
2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で Gemma 2 × vLLM を動かす。
kohecchi
5
920
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
みんなでプロポーザルを書いてみた
yuriko1211
0
260
A Journey of Contribution and Collaboration in Open Source
ivargrimstad
0
950
Featured
See All Featured
Ruby is Unlike a Banana
tanoku
97
11k
A Philosophy of Restraint
colly
203
16k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
How STYLIGHT went responsive
nonsquared
95
5.2k
The Pragmatic Product Professional
lauravandoore
31
6.3k
Embracing the Ebb and Flow
colly
84
4.5k
Why Our Code Smells
bkeepers
PRO
334
57k
Raft: Consensus for Rubyists
vanstee
136
6.6k
Practical Orchestrator
shlominoach
186
10k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
The Cost Of JavaScript in 2023
addyosmani
45
6.8k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Transcript
C++でつくる 歴史シミュレーションGIS C++ MIX #9 2023-02-09
GitHubリポジトリのQRコードと URLを表示するのでお手持ちの スマホ or パソコンをご用意ください
https:// github.com/ AsPJT/PAX_SAPIENTICA GitHubリポジトリ
PAX SAPIENTICA 文献学・考古学・人類学データを用いた ABS & GIS 各国・各時代の暦表示機能や各時代の環境復元機能を持つ XYZ タイルや地物を自由に追加することが可能
補足(学問) 文献学:日本書紀,古事記等の文字資料から歴史を考察 考古学:遺跡から出た遺物・遺構から歴史を考察 人類学:人骨の形質や遺伝子の情報から歴史を考察
補足(用語) ABS:Agent-based Simulation(後に解説) GIS:地理情報システム - Geographic Information System XYZタイル・地物:GISで表示する地図や点のこと
PAX SAPIENTICA 文献学・考古学・人類学データを用いた ABS & GIS 各国・各時代の暦表示機能や各時代の環境復元機能を持つ XYZ タイルや地物を自由に追加することが可能
None
開発期間 2023年1月10日から現在まで(1年ちょっと) 927 コミット / 96 プルリクエスト 2024年1月10日 ソフトウェア正式リリース
開発意義 歴史的事象の分析を得意とするGISは少ない 一般のGISは空間情報の扱いに長けているが 歴史にとって重要な時間情報の扱いは不向きなことが多い
開発意義 そのため,歴史的事象の分析のためのABSとGISの 双方の機能を持つソフトウェアを開発した 時間情報,空間情報,シミュレーションの3つの機能を 持つ汎用性・拡張性の高いソフトウェアを目指した
開発者(2人体制) 企画の立案が得意 Windows環境で開発 厳密な設計が得意 Mac環境で開発 私 相方
開発担当 データ作成・デザイン 描画関連・仕様の作成 暦と地図機能の作成 Windows/Android 対応 CI/CD・自動化周り CMake・ビルド環境整備 シミュレーションの作成 Mac/Linux
対応 私 相方
サポート環境 両方が担当
対応言語 C++17 をサポート 【理由】スマホ対応のためAndroid NDKに合わせた ※最近C++20に対応した噂を聞いている(要確認) いずれC++20や23へと対応していきたい 両方が担当
コンパイラ GCC・Clang・MSVCをサポート CI (GitHub Actions) ではGCCとClangでビルド実行 私の手元ではMSVCでビルド実行 相方の手元ではClangでビルド実行 主に相方が担当
CI/CD関連 CI は GitHub Actionsを使用 単体テスト,全体ビルド等がある 現在は6種類存在 テストはGoogle Test を使用
相方が担当
スクリプト一覧 CodeCounter.py:コード行数をカウント / CTest.*: CTestを実行 DevelopmentBuild.sh(.bat): MapViewerの開発ビルドを行う ProductionBuild.sh(.bat): MapViewerの本番ビルドを行う SyncSubmodule.sh(.bat):
submoduleを同期する UbuntuBuild/Build.sh: Ubuntu上でのビルドを行う UbuntuBuild/docker-compose.yml: build環境を 構築するためのdocker-composeファイル 相方が担当
ライブラリ行数 内製ライブラリの行数の合計は 「10803行」 意外とたくさん書いている (大規模なのか,それとも無駄が多くて汚いコードなのか) 両方が担当
ライブラリの構造 3種類用意 PAX_SAPIENTICA:描画ライブラリに依存しないもの PAX_GRAPHICA:描画ライブラリをラップするもの PAX_MAHOROBA:描画ライブラリに依存するもの 私が担当
描画Libraryのラップ 書籍のように100年後も扱える製品にしたい 大きい外部ライブラリの依存を少なくしたい 長方形の描画など基本的な機能を追加 マクロ分岐で自由に描画ライブラリを選択 私が担当
対応した描画Library OpenSiv3D・SFML・DxLibに対応 DirectX, Vulkan, Metal 等を直接使用はしていない 時間がかかるので簡単に描画できるものを使用 Qt などにも対応したらより便利かも 本質じゃないのであまり時間はかけたくない
主に私が担当
開発時の主な描画 OpenSiv3Dが便利で使いやすいので愛用 スマホ対応で究極のC++描画ライブラリになると期待 Android対応でDxLib,外で人前で作品を見せるときに スマホやタブレットで動くものがあると便利 私が担当
その他のライブラリ Google Test:テストに使用 stb:画像の入出力に使用 OpenMP:並列化に使用(ただしほぼ未使用) 今後更に追加される可能性あり 両方が担当
対応OS(GUI) Windows・Mac・Android・Linuxをサポート iOS はサポート無し(いずれサポートしたい) 入力デバイスも自由:マウスのみ,キーボードのみ, タッチのみでも基本動作はほぼすべて対応 両方が担当
None
開発環境(GUI) 【 SFML 】 CMake,ソリューション (.sln) 【 OpenSiv3D 】 ソリューション
(.sln) 【 DxLib (Windows) 】 ソリューション (.sln) 【 DxLib (Android) 】 Android Studio 両方が担当
地図機能 私が担当
地図の描画 GISなので地図を描画する機能が必要 様々な地図投影法が存在するが,メルカトル図法のみ使用 メルカトル図法とは経度と緯度が常に直交する図法 メルカトル図法の地図を分割して表示する形式が望ましい その形式である「XYZタイル形式」をサポートした 私が担当
XYZタイルとは 世界測地系の経緯度が正方形に変換されるよう極域の 一部地域(北緯及び南緯約85.05112878度以上)を 除外した範囲をメルカトル投影を使って変換された地図 地図をコンピュータで管理しやすくした形式 Z(Zは0以上の整数)がズームレベル,2のZ乗が分割数 私が担当
XYZタイルの座標 私が担当
初期の地図表示 二次元 std::vector で管理 表示範囲が変わった時に画像全て読み直し トンデモ実装・めちゃくちゃ重い 私が担当
初期の地図表示 表示範囲が変わった時に 元々読み込んであるものを保持しつつも 新しい画像を読み込んで管理する良い方法ないかな std::unordered_map を使えば簡単にできるのでは? 私が担当
地図の仕組み std::unordered_map の Key の型は uint64 を使用 Z=8bit, Y=24bit, X=24bit
としている(※8bit 余っている) XYZタイルのズームレベルとX・Y座標を入れるだけで 簡単かつ高速に管理が可能となった 私が担当
地図の仕組み Z=7が約1km間隔,Z=17が約1m間隔 つまり、Z=24が約7.6mm間隔 基本的にタイルはZ=17までのものがほとんど Z=24まで対応しているが24まで使用することはほぼ無い 私が担当
None
列挙型撲滅プロジェクト 私が担当
enum定義の問題点 ユーザが自由に定義できない点 ソースファイルに直接書き込んでしまう点 数値で管理するため,文字列と相性が悪い点 などなど 私が担当
文字列で管理 自由にユーザが追加しやすい 一方でenumや数値管理よりも処理が重くなる 自由度を保ち,処理を軽くするには 文字列を数値へ変換すれば良い 私が担当
文字列を数値へ変換 文字列を数値へ変換して管理する MurmurHash3関数という 文字列をuint32へ変換する機能を用意 コードの大部分を改修 私が担当
TSV読み込みと管理 ・画像 ・地名/人名 ・言語/テキスト ・暦 ・シミュレーション ・その他設定 私が担当
TSV読み込みと管理 1行目を読み込む→MurMur3で数値に変換し,数値で保持 対応する構造体へ変換,2行目以降を格納 文字列データを数値として保持することによって 高速にもなり,汎用性も上がった 私が担当
主に相方が担当 シミュレーション
ABSとは エージェントを用いた仮想実験(シミュレーション) 日本ではマルチエージェントシミュレーション(MAS)と 呼ばれることが多い 「マルチエージェントシステム」や「エージェントベース モデル」等の似た用語がある 主に相方が担当
None
主に相方が担当 シミュレーションは巨大で 今回の時間内で話すのは不可能 また次の機会に……
簡単なまとめ CIでGCC/Clangをビルド実行,C++17を使用 開発環境はCMake・VS sln・Android Studioに対応 分割された地図は std::unordered_map で管理 文字列をMurMur3で uint32
へ変換して処理高速化
https:// github.com/ AsPJT/PAX_SAPIENTICA GitHubリポジトリ
PAX SAPIENTICA 文献学・考古学・人類学データを用いた ABS & GIS 各国・各時代の暦表示機能や各時代の環境復元機能を持つ XYZ タイルや地物を自由に追加することが可能