WebRTCでのオープンソースクラウドゲーム:p2p、マルチプレーヤー、ゼロレイテンシ



サービスとしてのソフトウェア、サービスとしてのインフラストラクチャ、サービスとしてのプラットフォーム、サービスとしての通信プラットフォーム、サービスとしてのビデオ会議、サービスとしてのクラウドゲームはどうですか?クラウドゲーム(Cloud Gaming)を作成する試みはすでにいくつか行われています。たとえば、最近Googleが立ち上げたStad​​iaです。 StadiaはWebRTCの初心者ではありませんが、他の人も同じようにWebRTCを使用できますか?



Thanh Nguyenは、CloudRetroオープンソースプロジェクトでこの可能性をテストすることにしました。CloudRetroは、人気のあるGoベースのWebRTCライブラリであるPionに基づいています(この記事を手伝ってくれたPion開発チームのSean感謝します)。この記事では、Thanhがプロジェクトのアーキテクチャの概要を説明し、また、彼が学んだ有用なことと、作業中に直面した課題についても説明します。



前書き



昨年GoogleがStadiaを発表したとき、それは私の心を驚かせました。このアイデアは非常にユニークで革新的であるため、既存のテクノロジーでこれがどのように可能であるかを常に考えていました。このトピックをよりよく理解したいという願望から、独自のバージョンのオープンソースクラウドゲームを作成することになりました。結果は素晴らしかった。以下に、私の1年間のプロジェクトに取り組むプロセスを共有したいと思います。



TLDR:ハイライト付きの短いスライドバージョン



クラウドゲームが未来である理由



Cloud Gamingは、ゲームだけでなく、コンピューターサイエンスの他の分野の新世代になると私は信じています。クラウドゲームは、クライアント/サーバーモデルの頂点です。このモデルは、リモートサーバーでゲームロジックをホストし、クライアントに画像/音声をストリーミングすることで、バックエンド制御を最大化し、フロントエンド作業を最小化します。サーバーは重い処理を行うため、クライアントはハードウェアの制約を受けなくなります。



Google Stadiaでは、基本的にAAAゲームをプレイできます(つまり、ハイエンドの大ヒットゲーム)YouTubeのようなインターフェースで。同じ方法を、オペレーティングシステムや2D / 3Dグラフィックデザインなどの他の重いオフラインアプリケーションにも適用できます。さまざまなプラットフォームの低スペックデバイスで安定して実行できるようにします。





このテクノロジーの将来:Microsoft Windows 10がChromeブラウザーで実行されたかどうか想像できますか?



クラウドゲームは技術的に挑戦的です



ゲームは、常に迅速なユーザー応答が必要とされるまれな領域の1つです。ページをクリックしたときに2秒の遅延が発生することがある場合は、それで問題ありません。ライブビデオストリームは数秒遅れる傾向がありますが、それでもかなりの使いやすさを提供します。ただし、ゲームが500ミリ秒遅れることが多い場合、プレイすることは不可能です。私たちの目標は、入力とメディアの間のギャップを可能な限り小さくするために、非常に低いレイテンシーを達成することです。したがって、ストリーミングビデオへの従来のアプローチはここでは適用できません。





一般的なクラウドゲームテンプレート



オープンソースプロジェクトCloudRetro



クラウドゲームのテストサンプルを作成して、このような厳しいネットワーク制限の下でこれらすべてが可能かどうかをテストすることにしました。Golangは私の最も身近な言語であり、後で判明したように、他の多くの理由でこの実装に適しているため、概念の証明としてGolangを選択しました。Goはシンプルで、非常に迅速に進化します。Goのパイプは、マルチスレッドの管理に最適です。CloudRetro.io



プロジェクトは、レトロゲーム用のオープンソースクラウドゲームサービスです。このプロジェクトの目標は、従来のレトロゲームに最も快適なゲーム体験をもたらし、マルチプレーヤーを追加することです。 このプロジェクトの詳細については、https//github.com/giongto35/cloud-gameをご覧ください





CloudRetro機能



CloudRetroは、クラウドゲームの全機能を紹介するために、レトロゲームを使用しています。これにより、さまざまなユニークなゲーム体験が可能になります。



  • ゲームの移植性

    • ページを開いたときのインスタント再生。ダウンロードやインストールは必要ありません
    • モバイルブラウザで動作するため、実行にソフトウェアは必要ありません


  • ゲームセッションは複数のデバイス間で共有でき、次回のログインのためにクラウドに保存できます
  • ゲームはストリーミングすることも、複数のユーザーが同時にプレイすることもできます。

    • TwitchPlayPokemonのようなクラウドプレイ、よりクロスプラットフォームでよりリアルタイム
    • オンラインのオフラインゲーム。多くのユーザーは、ネットワークを設定せずにプレイできます。サムライショウダウンは、CloudRetroネットワーク上の2人のプレイヤーがプレイできるようになりました




    さまざまなデバイスでのマルチプレーヤーオンラインゲームのデモバージョン



    インフラ



    要件とテクノロジースタック



    , .



    1.

    , , . , CDN, . , WebSocket, WebRTC.



    2.

    Stadia, WebRTC. , WebRTC – , . WebRTC – , - API. , , VP8 H264.



    , . . Google Stadia , .



    3.

    , , , . - (RTT). 1 , : , , , , . . , . , , .



    4.

    , . , . , . - . , WebRTC .



    5.

    . . LibRetro , LibRetro -, SNES, GBA, PS.



    6. , crowd play (deep-link)

    CloudRetro , CrowdPlay Online MultiPlayer -. deep-link , .



    , . .



    7.

    SAAS , , . «-» , .



    8.

    CloudRetro (Digital Ocean, Alibaba, ) . Docker bash-, . NAT Traversal WebRTC, CloudRetro .





    : ( , ) , . , .



    : . WebSocket.



    : . , , , /.





    CloudRetro





    CloudRetro 1 2, , . 3 HTTP ping. , . 4 . WebRTC.









    . Golang . , .. .









    :



    • WebRTC: , .

    • : . Libretro .

    • .

    • / : , , /.





    CloudRetro WebRTC , , Golang, WebRTC. , .



    WebRTC



    WebRTC API.



    NAT Traversal



    WebRTC NAT Traversal. WebRTC . – , NAT- ICE. API WebRTC IP- STUN (TURN), .



    CloudRetro . , . , . IP- , NAT.



    Cloud Gaming. , . . CloudRetro , , . WebRTC NAT Traversal , .





    – , . , VP8/H264, , .



    , , + + , . , . – , , .



    , , . , , . c Pacman’, .





    Pacman





    , , . Opus . , RTP (Real Time Transport Protocol – ). , mp3 aac, . 5~66,5 .



    Pion, WebRTC Golang



    Pion – , WebRTC Golang. C++ WebRTC, Pion Golang- WebRTC , Go, WebRTC.



    . STUN, DTLS, SCTP .. QUIC WebAssembly. , .



    Pion, , , WebRTC. , http://pion.ly/slack – .



    CloudRetro Golang





    Go



    Go



    Go, . , GoRoutines . . Golang (game tick). , . , , . , , . game tick’ , .



    func (e *gameEmulator) gameUpdate() {
    for {
    	select {
    		case <-e.saveOperation:
    			e.saveGameState()
    		case key := <-e.input:
    			e.updateGameState(key)
    		case <-e.done:
    			e.close()
    			return
    	}
        }
    }


    Fan-in / Fan-out



    Golang CrowdPlay Multiple Player. , . . , .









    Golang



    Golang . . Go – , . . , .



    , garbage collector Golang , - . .



    CGO



    VP8/H264 Golang Libretro . C Go CGO. Dave Cheney. , :



    • CGO, Golang RecoveryCrash;
    • , CGO.




    – , - . Pion Pion. . API, WebRTC Pion, . , , (P2P).



    , P2P- . , IP NAT . , P2P- WebRTC.



    CloudRetro , , , -. , , , , , , , . . , , .



All Articles