Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C++でつくる歴史シミュレーションGIS
Search
As Project
February 11, 2024
Programming
0
430
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
190
クソアプリハッカソン 2023
aspjt
0
51
世界を創造するOSS開発を始めた話
aspjt
0
83
Other Decks in Programming
See All in Programming
大規模サイトリビルドの現場から:成功と失敗のリアルな教訓 / Site Rebuild,Real Lessons Learned from Successes and Failures_JJUG Fall 2024
techtekt
0
210
最新TCAキャッチアップ
0si43
0
250
似たもの同士のPerlとPHP
uzulla
1
110
Arm移行タイムアタック
qnighy
0
410
Jakarta EE meets AI
ivargrimstad
0
1.2k
MoQとか勉強会#2 発表資料
yuki_uchida
2
490
React CompilerとFine Grained Reactivityと宣言的UIのこれから / The next chapter of declarative UI
ssssota
7
3.3k
Criando Commits Incríveis no Git
marcelgsantos
1
140
N.E.X.T LEVEL
pluu
2
260
Develop iOS apps with Neovim / vimconf_2024
uhooi
1
310
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
670
たのしいparse.y
ydah
3
110
Featured
See All Featured
Building Applications with DynamoDB
mza
91
6.1k
Embracing the Ebb and Flow
colly
84
4.5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
Six Lessons from altMBA
skipperchong
27
3.5k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Rails Girls Zürich Keynote
gr2m
94
13k
Building Your Own Lightsaber
phodgson
103
6.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
250
Gamification - CAS2011
davidbonilla
80
5.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
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 タイルや地物を自由に追加することが可能