技術日蚘モバむルPvP開発の半幎





2017幎3月、小さなチヌムを線成し、新しい有望なプロゞェクトの開発に着手したした。 特別な詳现がなければ、このタスクは面癜くお魅力的だったず蚀えたす-モバむル、同期、チヌムPvP。 7か月にわたる積極的な開発の埌、他のプロゞェクトや郚門の同僚にPixonicの技術的な詳现を䌝えたかったので、圌らのためにプレれンテヌションを準備したした。



技術チヌムずしお、私たちが盎面したタスクず問題、それらを解決する方法ず理由を説明したす。 プロゞェクトに機胜を远加するために反埩アプロヌチを䜿甚し、珟圚実装しおいたすiOSおよびAndroidのPvP䞡方のプラットフォヌムが同じサヌバヌで再生されたす。 キャラクタヌのセット、3ダヌスのゲヌムの仕組み、ボット。 マッチメむキング; メタ機胜のセットキャラクタヌのカスタマむズ、レベリングなど。 党䞖界ぞのスケヌラビリティの問題を解決したした。



行きたしょう。



免責事項

しかし、私はすぐに、蚘事に蚘茉されおいる゜リュヌションがすでに倚くの状況で構成されおいる歎史的な珟象ず事実であるずいう予玄をしなければなりたせん補品のビゞネスずゲヌムの蚭蚈芁件、期限、チヌムの可胜性、最初のいく぀かの問題の未知性。 これはベストプラクティスではありたせんが、決しお冗長な経隓ではありたせん。



痛い、楜しい



開発が始たる前でさえ、私たちはすでに盎面しなければならないいく぀かの困難をすでに提瀺しおいたした。 すなわち





次に、「問題-解決策」ずいう圢で状況を説明しようずしたした。



コヌドの保存ず共有



既に述べたように、プロゞェクトは3぀のサブプロゞェクトで構成されおいたす。





すべおのCIプロセスがより高䟡になり、時間がかかるため、すべおを1぀のgitリポゞトリに栌玍するずプラスよりもマむナスが倚いず考えたした。 その結果、3぀のリポゞトリがありたす。



プロトコルバッファを䜿甚しお、3぀すべおのサブプロゞェクト間でメッセヌゞを亀換したす。 したがっお、これらのメッセヌゞの.protoファむルず生成されたコヌドファむルをどこかに保存する必芁がありたすちなみに、生成されたファむルをコミットするこずはお勧めできたせんが、Unityでは開くずきにコンパむルの回数が枛り、時間を節玄できたす。 さらに、それらはプロトコルごずに異なる必芁がありたす。サヌバヌずクラむアントは異なる匕数を必芁ずするため、パケットを再利甚する意味はありたせん。 これらのファむルをすべおのプロゞェクトに受け取る方法がありたした。 gitサブモゞュヌルで解決したした。 メむンプロゞェクトの3぀のペアのそれぞれの間で、远加のリポゞトリを開始し、サブモゞュヌルずしおメむンプロゞェクトに远加したした。 珟圚、6぀のリポゞトリがありたす。



シミュレヌションのデバッグず、サヌバヌに瞛られずにゲヌムシミュレヌションを実行する機胜を高速化するために、シミュレヌションコヌドを分離したした。 これにより、倚くの機䌚が䞎えられたした-時間の加速を備えたコン゜ヌルアプリケヌションずしお数癟のゲヌムの起動をプロファむリングしたり、たずえば、ロヌカルの戊闘蚓緎䜜業のためにUnityクラむアントでシミュレヌションを䜿甚したりしたす。 これは、制䜜自䜓にずっおも非垞に䟿利です。新しいゲヌム機胜を䜜成するプログラマヌはすぐにUnityをプレむでき、ロヌカルサヌバヌを展開する必芁さえありたせん。 シミュレヌションコヌドをクラむアントずゲヌムサヌバヌに配眮するには、別のサブモゞュヌルに移動する必芁がありたした。



しばらくしお、ゲヌム構成の倉曎を保存および远跡する必芁がありたした。その必芁な郚分はサブプロゞェクトから分岐し、逆シリアル化のプロトスキヌムを含む別のサブモゞュヌルを䜜成したした。







私はすでに長所に぀いお話したしたが、今は短所に぀いお話したした





プレヌダヌの入力損倱



ここで、補品に盎接関係する問題にさらに目を向けたす。 ゲヌムサヌバヌずモバむルクラむアントの間では信頌性の䜎いUDPを䜿甚しおいたすが、これはメッセヌゞ配信や正しい順序を保蚌するものではありたせん。 もちろん、これはプレむダヌ自身にずっお重倧な問題を数倚く課したす。 良い䟋は、高䟡で匷力なロケットずそれを起動するボタンです。 プレむダヌは、この胜力を䜿甚するのに適した状況を埅ち、ボタンを1回抌すず、最も郜合の良い瞬間に、自分の意芋で刀断したす。 プレむダヌがこの瞬間を通過できないように、この情報をサヌバヌに確実か぀できるだけ早く配信する必芁がありたす。 しかし、このパッケヌゞが消えるか2秒で到着するず、目暙は達成されたせん。



最初は、受信確認がない状態でデヌタを送信する戊略を怜蚎したしたが、時間の損倱をできるだけクラむアントデヌタの送信期間に近づけたいず考えたした。 远加のタスクは、サヌバヌでのシミュレヌションでキャラクタヌがスタンを終了した埌、スタンの䜜業䞭にショットボタンを抌すこずでした。



この゜リュヌションは安䟡であるこずが刀明したしたが、効果的です。



  1. クラむアントの䜜業の各フレヌムで、入力を蚘録しお番号を付けたす。
  2. それらをクラむアントのコレクションに保存し、サヌバヌに耇数の最埌のレコヌドたずえば、最埌の10を䞀床に送信したす。 このようなメッセヌゞのサむズは非垞に小さくクラむアントから平均で玄60バむト、䜙裕がありたす。
  3. サヌバヌはメッセヌゞを受信し、ただ受信しおいない郚分のみをメッセヌゞから取埗しお、凊理順番に远加したす。 したがっお、䞀郚のパッケヌゞがサヌバヌからクラむアントに到達しない堎合、次に到着するパッケヌゞには垞に最新の入力履歎党䜓が含たれたす。
  4. キャラクタヌの準備ができたずきキャンプを出るずきにスキルの䜿甚を延期する問題を解決するために、すべおのデヌタがそこにありたす。 凊理ロゞックは、特定のプレヌダヌ甚にどの入力フレヌムが凊理されたかを認識しおおり、特定のゲヌムプレむの状況では、できるだけ早くそれを凊理し続けたす。 この堎合のアプロヌチの利点は、入力キュヌの「穎」を芋逃すこずがほずんどないこずです。


クラむアントの画像の滑らかさの問題



非保蚌の配信方法を䜿甚するず、サヌバヌからクラむアントに䞖界の状態を戻すずいう問題にも盎面したす。 しかし、それに぀いおは埌で。 たず、ネットワヌクを介しお状態を転送するプロゞェクトゲヌムのチヌムが解決する必須の問題に぀いお説明したす。



ゲヌムサヌバヌを想像しおください。これは、同じこずを1秒間に䞀定回数実行するアプリケヌションです。ネットワヌク経由で入力を受け取り、決定を䞋し、ネットワヌク経由で状態を送り返したす。 そしお今、クラむアントを想像しおください-これは、特に1秒あたり特定のフレヌム数たずえば60でゲヌムの状態を衚瀺するアプリケヌションです。 ネットワヌクから送信されたものを衚瀺するようにするず、クラむアントは2〜3フレヌムごずに同じ着信状態を衚瀺し、衚瀺がぎくしゃくしたす。たた、䞍均等な配信の堎合は、時間を加速/枛速したす。 衚瀺をスムヌズにするために、サヌバヌからの2぀の状態間の補間を䜿甚しお、いく぀かの必芁なフレヌムの蚈算された䞭間倀を衚瀺する必芁がありたす。



私たちは過去にクラむアントを去っおいたす...



ただし、この時点では状態が1぀しかなく、䞭間フレヌムを描画する秒はありたせん。 どうする 解決策クラむアントむベントの時間を過去に少しずらすこずで、レンダリングの時点で、次の䞖界の状態が来る理論䞊の機䌚をすでに埗おいたす。



実際には、それほどバラ色ではありたせん。UDPは配信を保蚌したせん。䞖界の状態がクラむアントに到着しない堎合、数フレヌム衚瀺するデヌタがありたせん。いわゆる「フリヌズ」を取埗したす。 入力遅延ずパケット損倱の割合のバランスをずり、2送信期間+半RTTの過去ぞの逞脱を䜿甚したす。 したがっお、1぀のパケットが倱われた堎合でも、次のパケットを受信する時間がありたす。 同時に、パケットの受信が2期間以䞊䞭断された堎合、さらに切断される可胜性が非垞に高くなりたす。これは、自発的な遅延よりもプレヌダヌにずっおはるかに理解しやすいものです。 プレヌダヌには再接続りィンドりが衚瀺され、ゲヌム䜓隓をそれほど損なうこずはありたせん。



断続的なPingの問題



実際には、補間ずフォヌルバックを備えたスキヌムは垞にうたく機胜するずは限りたせん。 プレヌダヌは、10ミリ秒のPingで自宅でWi-Fiをプレむしおゲヌムを開始し、倖に出おタクシヌに乗り、既に100ミリ秒のPingでモバむルむンタヌネットをオンにしお街䞭を走りたす。 この堎合、ゲヌムの開始時にRTTを芚えおいるず、パッケヌゞが完党に、均等に、か぀損倱なく配信される堎合でも、プレむダヌは補間のための十分な時間を絶えず持぀こずができたす。



このケヌスでは、この問題を次のように解決したした。



  1. パケット到着時間ずそれが意味するサヌバヌ時間を分析するたびに。
  2. ネットワヌクの状態が悪化した堎合、必芁なマヌゞンで、さらに倧きな過去にスムヌズに移行するため、ルヌルは次のようになりたす。



     2 * Send Rate + RTT/2
          
          



  3. クラむアントでは入力遅延が増加したすが、画像は滑らかなたたです。


芖芚的には、これを発芋したずき、クラむアントがすでに遅れ始めおいるずいう問題が残っおいたす。 すぐに過去に移動するわけではありたせんが、短時間0.5秒以内に、この堎合でも1〜2フレヌムのデヌタは保持されたせん。 送信レヌトが1を超えるpingドロップの堎合、プレヌダヌは小さな1 \ 30秒1回のゞャヌクに気付きたす。



同様に、反察方向でpingが枛少した堎合、クラむアントはこれを刀断し、ディスプレむを珟圚に近づけお、滑らかな画像ず最小入力遅延の最適なバランスを実珟したす。



質問ぞの回答



結論ずしお、あなたが持っおいるかもしれないいく぀かの質問に答えたいず思いたす。



入力遅延ず戊うのではなく、シミュレヌションでクラむアントの動䜜をロヌカルで予枬しないのはなぜですか



この決定は、ゲヌムのゞャンルず仕組みに基づいおいたすファヌストパヌ゜ンシュヌティングゲヌムを䜜成する堎合、瞬間的な珟象があり、プレむダヌの圱響がキャンセルされない堎合は、ロヌカル予枬+ラグ補正が最適です。 ゲヌムプレむに倚数の霜、抌し蟌み、およびプレヌダヌに圱響を䞎えお行動を倉える他のメカニズムが含たれる堎合、ネットワヌクアヌティファクトの出珟は100に近づきたす。 この点で最も必死なのは、最小限のアヌティファクトずロヌカル予枬の必芁性ずの最適なバランスを芋぀けたBlizzard Overwatchプロゞェクトチヌムです。 しかし、これはPC䞊にあり、プレむダヌの平均的なpingが理論的にこれを蚱可したす。 私たちの堎合、ロヌカルプレヌダヌでは、100の堎合、前方ぞの急な動きは「テレポヌト」で終了し、初期状態ぞの衝撃がありたす。



異なるpingを持぀異なる囜のプレむダヌはどのようにプレヌしたすか



pingが最高の人は、反応する時間がもっずあるので、圓然のこずながら利点がありたす。 䟋敵がプレむダヌに発射物を投げたいずしたす。 pingが䜎いプレヌダヌは、敵のアニメヌションの開始に少し早く気づき、防埡アクションを実行する機䌚が増えたす。 さらに、保護アクションはより速くサヌバヌに到達し、回避を管理する可胜性が高くなりたす。



䞡方が同時にクリックされ、1人のプレむダヌにさらにpingを実行した堎合、最初に誰が撮圱したすか



サヌバヌはプレスの時間を考慮せず、入力の到着時間ずその順序のみを考慮したす。そのため、䞊蚘の答えの原理が機胜したす。



もう䞀぀



私が曞いた資料が、同様の道を歩む他の開発者に圹立぀こずを願っおいたす。 䞀般に、この期間䞭にプロゞェクトには倚くの問題ず解決策が蓄積されおいるため、耇数の蚘事を曞くには十分です。



頑匵っお



All Articles