2 ポイント 投稿者 GN⁺ 2023-06-26 | 1件のコメント | WhatsAppで共有
  • Hypersomnia はコミュニティ主導のマルチプレイヤーシューターで、友人とのデュエルや2つのクラン間の戦闘をサポートし、2017年からオンラインプレイが可能なゲーム
  • Modern C++ で書かれており、ゲームエンジンなしで実装され、無料のオープンソースゲームとして提供されている
  • ゲーム構成は Counter-Strike の戦術、Hotline Miami のダイナミズム、オールドスクールRPGのピクセルアート的ノスタルジーを組み合わせたもので、現在は24種類のユニークな銃器、10個のコミュニティマップ、Bomb defusalGun 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::sinstd::sqrt のような数学関数は STREFLOP 系実装に置き換えている
    • プレイヤーが操作するキャラクター2体の例では、60Hz tickrate 基準のトラフィックは約 40 kbit/s (= 5 KB/s) で、ネットワークトラフィックに寄与するのはプレイヤー操作キャラクターのみ
  • ブラウザクライアントとネイティブクライアントは libdatachanneldatachannel-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件のコメント

 
GN⁺ 2023-06-26
Hacker News のコメント
  • 浮動小数点で 100% 決定的な動作 を得るには、同じ数学関数を使っていても同じコンパイラが必要だとは知らなかった。
    浮動小数点演算は完全に仕様化されていないのかと思ったが、先に検索すべきだった: https://stackoverflow.com/questions/49471943/floating-point-...
    • 私の理解では、標準は 数学関数 までは仕様化していない寄りだ。
      sqrt は1命令で終わるわけではなく、テイラー近似から始めて Newton 法を数回回して答えを洗練するといった形なので、テイラー級数の次数、中心点、反復回数のような選択肢が生じる。
      IEEE 754 は乗算は規定できても、sqrtsincostan は計算方法を決める必要があり、通常その実装はコンパイラが提供する標準ライブラリにある。
      しかも浮動小数点では結合法則が成り立たないため (a+b)+c != a+(b+c) であり、基本演算の順序を変えるだけでも結果が分かれうる
    • アーキテクチャが違っても決定性が保証されるのかは定かではない。
      丸め方式がアーキテクチャごとに異なる可能性があり、arm/amd/intel を混在させると非決定的な動作が出る可能性がある: https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
      このゲームはその問題を避けるために ソフトウェア浮動小数点実装 を使っているようで、統一されたコンパイラまで加えれば大半の問題は回避できそうだ
    • Sun 時代の文書でかなり長い記事があるが、今は Oracle 所有なので、結論から読んで逆にたどるほうが楽そうだ。
      https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
    • 浮動小数点の決定性は理論上は決定的に動くべきに思えるが、実際には 無法地帯 に近い。
      C をはじめ多くの言語では、一般的な演算子が特定の浮動小数点演算に明示的にマッピングされておらず、コンパイラの裁量が大きい。
      また丸めモードのような 見えないグローバル状態 もある程度使われていて、記憶では DirectX が裏でフラグを切り替えることがあった
    • 同じコンパイラを使っていても、-march が異なると結果はかなり変わりうる
  • 「ネットワーキングはクロスプラットフォームなシミュレーションの決定性に基づいている」という部分は、Springrts[0] が2000年代後半に同じ理由ですでにやっていたことで、多くの RTS もそうだった気がする。
    ただしオープンソースではなかっただけで、これが成果ではないという意味ではない。実際、本当に難しいことだ。
    [0] https://springrts.com/
    • 引用されたタイトルの下の詳細にその部分が出てくる。
      ここでの違いは、RTS ゲームが 決定的な浮動小数点物理 を使っていないため、Hypersomnia には新しい解決策が必要だということだ
    • Spring は Balanced Annihilation で非常に長く遊んだ。
      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 でのリリース計画があるのか、持続世界 がゲームプレイにどう影響するのかが気になる。
    新しいプレイヤーが入ってきたときに物理状態を再構築する巧妙な手法が、既存プレイヤーにはどう見えるのかも気になる。たとえば弾の位置が動くのかといった点だ
    • 最近では PUBG のこのミニゲームで ゲームプレイプログラミング をしていた: https://www.youtube.com/watch?v=tSP5P0QGWa4
      貯蓄もうまく運用して、Hypersomnia に完全に集中できていた。
      Steam には 2024年より前に出したい

今のところ永続ワールドはまったくなく、ゲームが成功したら今後進みうる方向性をティーザーのように触れただけです
物理の再構築では位置がまったく移動してはいけません。再構築されるのは接触や木のような「ホットな状態」だけで、この状態が意味を持つのはある状態から次の状態へシミュレーションを進めるときだけなので、その後のレンダリングには影響しません
既存プレイヤーに与えうる唯一の影響は、再構築する物理ワールドが巨大な場合にフレームが一度落ちる程度ですが、実際にはまだすべてのマップが小さく、3v3の試合に最も適しています

  • クライアント接続時に物理状態を再構築するのは、同期の問題に対する見事な解決策です
  • まず、これは本当に非現実的なくらいすごく見えて、こういうものを見ると自分がコンピュータサイエンスについてどれだけ知らないかを改めて感じます
    次に、macOSで大きなバグを見つけました。一時停止画面/設定でマウス入力が大きくずれていて、メインメニューのオプションすらクリックできません
    画面キャプチャ、ログ、システムレポートをまとめてあります: https://youtu.be/O4OoMdeFAt0
    • macOSの問題についてはすみません
      ほとんどいつもWindowsとLinuxでプレイしていて、macOSは長時間動かしていなかったので、修正できるか確認してみます
  • うわ、ここ数年ずっと意図せずあなたの投稿をいくつか追って読んでいたことに今気づきました
    特にECSとネットワーキング関連の投稿です
    ここまで大きく進歩したのを見るのはうれしいです
    • 2013年にStack ExchangeでECSに関する投稿を書いたことはありますが、ネットワーキングについてきちんとした記事を出したのは今回が初めてだと思います
      READMEで決定論的アーキテクチャを説明するときにGlenn Fiedlerの重要なブログ記事へリンクはしていますが、私はその人ではないので、もし誤解を与えたならそういうつもりではありませんでした
  • ゲームプレイは2000年代初頭の古いトップダウン型マルチプレイヤーシューター Infantry Online を思い出させます
    https://www.freeinfantry.com/
    https://en.m.wikipedia.org/wiki/Infantry_(video_game)