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
440
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
52
世界を創造するOSS開発を始めた話
aspjt
0
84
Other Decks in Programming
See All in Programming
たのしいparse.y
ydah
3
120
php-conference-japan-2024
tasuku43
0
310
命名をリントする
chiroruxx
1
410
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
180
MCP with Cloudflare Workers
yusukebe
2
220
Amazon S3 NYJavaSIG 2024-12-12
sullis
0
100
Beyond ORM
77web
7
870
Zoneless Testing
rainerhahnekamp
0
120
PSR-15 はあなたのための ものではない? - phpcon2024
myamagishi
0
130
Spatial Rendering for Apple Vision Pro
warrenm
0
110
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
1
450
PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録
mashirou1234
0
200
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
98
The Invisible Side of Design
smashingmag
298
50k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
4 Signs Your Business is Dying
shpigford
181
21k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Designing Experiences People Love
moore
138
23k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Building Better People: How to give real-time feedback that sticks.
wjessup
365
19k
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 タイルや地物を自由に追加することが可能