Hypersomnia - オープンソースのマルチプレイヤーシューターと、Assassin's Creed: Valhalla・Skydioドローンで使われた技術
(github.com/TeamHypersomnia)- Hypersomnia はコミュニティ主導のマルチプレイヤーシューターで、友人とのデュエルや2つのクラン間の戦闘をサポートし、2017年からオンラインプレイが可能なゲーム
- Modern C++ で書かれており、ゲームエンジンなしで実装され、無料のオープンソースゲームとして提供されている
- ゲーム構成は Counter-Strike の戦術、Hotline Miami のダイナミズム、オールドスクールRPGのピクセルアート的ノスタルジーを組み合わせたもので、現在は24種類のユニークな銃器、10個のコミュニティマップ、Bomb defusal と Gun game の2つのモードを提供している
- 配布先は ブラウザプレイ、Steam、Windows、Linux AppImage、macOS dmg で、ゲーム開始時に interactive Tutorial が実行される
- サーバー実行は Server Docker または Headless AppImage で可能で、すべてのアーカイブにはデジタル署名が施され、署名検証の手順が提供されている
- 内蔵 マップエディター はゲームワールド内で直接作業する100% WYSIWYG方式で、ImGui で作られており、JSONマップ形式を使用する
- マップディレクトリに PNG、WAV、OGG フォルダを貼り付けると、ゲームが自動的に認識する
- GIF をシーンにドラッグ&ドロップすると、ゲーム内でそのままアニメーションとして動作する
- 作業中のマップはワンクリックでプレイテストでき、接続したクライアントは現在バージョンのマップとカスタムリソースを自動ダウンロードする
- サーバー、ゲーム、エディターはすべての OS で同じ実行ファイルに含まれているため、エディターからセッションを開始し、ESC で中断した後に元の状態へ戻れる
- ネットワーキングは クロスプラットフォームのシミュレーション決定性 に基づいており、ブラウザクライアントと Windows、Linux、macOS のネイティブクライアント、さらにネイティブ ARM ビルドまで100%決定的に動作する
- すべてのオブジェクト状態を継続的にネットワーク送信する代わりに、プレイヤー入力だけを送信し、残りは各クライアントがローカルでシミュレーションする
- 浮動小数点演算の決定性のため、すべての OS で
clangを使用し、Windows ビルドには/fp:strict、ARM ビルドには-ffp-model=strictを適用し、std::sin、std::sqrtのような数学関数は STREFLOP 系実装に置き換えている - プレイヤーが操作するキャラクター2体の例では、60Hz tickrate 基準のトラフィックは約
40 kbit/s (= 5 KB/s)で、ネットワークトラフィックに寄与するのはプレイヤー操作キャラクターのみ
- ブラウザクライアントとネイティブクライアントは libdatachannel と datachannel-wasm により、同じサーバーで一緒にプレイできる
- ブラウザでサーバーをホストしてネイティブクライアントから接続でき、ネイティブクライアントでサーバーを開いてブラウザ接続リンクを送ることもできる
- ブラウザ版は Discord ログインとランクマッチ、global Leaderboards をサポートし、Discord アカウントと Steam アカウントを連携すると Steam 版と Web 版で同じ rating を共有する
- テクスチャパッキング用に作られた rectpack2D は、Assassin's Creed: Valhalla、ドローンメーカー、2本の科学論文で使用されている
- メモリプール実装は、連続ストレージ、O(1) 割り当て、O(1) 解放、O(1) 逆参照、自動拡張、決定的動作を提供し、初期ワールド状態の送信時にはゲームオブジェクトプールの内部状態まで含めることで、クライアントが同一のオブジェクト識別子とメモリ順序を決定的にシミュレーションできるようにしている
- 内蔵 self-updater はアップデートを自動でダウンロード・適用し、
ssh-keygenの呼び出しによってハードコードされた開発者公開鍵由来のアップデートかどうかを検証し、ビルドのホスティング先が侵害されて悪意あるバージョンが公開された場合でも、既存クライアントはアップデートの適用を拒否する
1件のコメント
Hacker News のコメント
浮動小数点演算は完全に仕様化されていないのかと思ったが、先に検索すべきだった: https://stackoverflow.com/questions/49471943/floating-point-...
sqrtは1命令で終わるわけではなく、テイラー近似から始めて Newton 法を数回回して答えを洗練するといった形なので、テイラー級数の次数、中心点、反復回数のような選択肢が生じる。IEEE 754 は乗算は規定できても、
sqrt、sin、cos、tanは計算方法を決める必要があり、通常その実装はコンパイラが提供する標準ライブラリにある。しかも浮動小数点では結合法則が成り立たないため
(a+b)+c != a+(b+c)であり、基本演算の順序を変えるだけでも結果が分かれうる丸め方式がアーキテクチャごとに異なる可能性があり、arm/amd/intel を混在させると非決定的な動作が出る可能性がある: https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
このゲームはその問題を避けるために ソフトウェア浮動小数点実装 を使っているようで、統一されたコンパイラまで加えれば大半の問題は回避できそうだ
https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
C をはじめ多くの言語では、一般的な演算子が特定の浮動小数点演算に明示的にマッピングされておらず、コンパイラの裁量が大きい。
また丸めモードのような 見えないグローバル状態 もある程度使われていて、記憶では DirectX が裏でフラグを切り替えることがあった
-marchが異なると結果はかなり変わりうるただしオープンソースではなかっただけで、これが成果ではないという意味ではない。実際、本当に難しいことだ。
[0] https://springrts.com/
ここでの違いは、RTS ゲームが 決定的な浮動小数点物理 を使っていないため、Hypersomnia には新しい解決策が必要だということだ
TA と SupCom が残した空白を埋めてくれたし、SupCom 2 はそれ自体かなり良いカジュアルで小規模な RTS だったが、そこまでではなかった。
そして PA の話はしないでおこう。
BAR もかなり有望に見える: https://www.beyondallreason.info
ゲーム自体が AC:Valhalla に入ったのではなく、開発中に作られたテクスチャパッキングライブラリが使われたのだ[1]。もちろんその成果を貶めるつもりはなく、それ自体で1本の記事になる話だ。
また、Unity で使われた ECS システムの源流だったと言うのも少し誇張に見える。2010年以前にも ECS を使うゲームエンジンを使ったことがあり、ゲームエンジン界隈では Operation Flashpoint[2] 由来のように見える。
[1] https://github.com/TeamHypersomnia/rectpack2D
[2] https://t-machine.org/index.php/2007/09/03/entity-systems-ar...
いつか時間ができたら、たぶん引退後にこういうことをやってみたいし、こうしたプロジェクトはその世界を学ぶ教材になる可能性が高い
90年代後半の ARC、つまり Attack Retrieve Capture を思い出すが、今は Armor Critical としてかろうじて続いている状態だ。
https://en.wikipedia.org/wiki/Attack_Retrieve_Capture
http://armorcritical.com
プロジェクトを維持するために商業的には他にどんな仕事をしてきたのか、Steam でのリリース計画があるのか、持続世界 がゲームプレイにどう影響するのかが気になる。
新しいプレイヤーが入ってきたときに物理状態を再構築する巧妙な手法が、既存プレイヤーにはどう見えるのかも気になる。たとえば弾の位置が動くのかといった点だ
貯蓄もうまく運用して、Hypersomnia に完全に集中できていた。
Steam には 2024年より前に出したい
今のところ永続ワールドはまったくなく、ゲームが成功したら今後進みうる方向性をティーザーのように触れただけです
物理の再構築では位置がまったく移動してはいけません。再構築されるのは接触や木のような「ホットな状態」だけで、この状態が意味を持つのはある状態から次の状態へシミュレーションを進めるときだけなので、その後のレンダリングには影響しません
既存プレイヤーに与えうる唯一の影響は、再構築する物理ワールドが巨大な場合にフレームが一度落ちる程度ですが、実際にはまだすべてのマップが小さく、3v3の試合に最も適しています
次に、macOSで大きなバグを見つけました。一時停止画面/設定でマウス入力が大きくずれていて、メインメニューのオプションすらクリックできません
画面キャプチャ、ログ、システムレポートをまとめてあります: https://youtu.be/O4OoMdeFAt0
ほとんどいつもWindowsとLinuxでプレイしていて、macOSは長時間動かしていなかったので、修正できるか確認してみます
特にECSとネットワーキング関連の投稿です
ここまで大きく進歩したのを見るのはうれしいです
READMEで決定論的アーキテクチャを説明するときにGlenn Fiedlerの重要なブログ記事へリンクはしていますが、私はその人ではないので、もし誤解を与えたならそういうつもりではありませんでした
https://www.freeinfantry.com/
https://en.m.wikipedia.org/wiki/Infantry_(video_game)