しがないエンジニアのブログ

技術的な内容をメモ代わりにつらつら

[Unite2019] 「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック

動画・スライド:https://learning.unity3d.jp/3345/

平井 佑樹 KLab株式会社
稲田 真吾 KLab株式会社
西那 康志 KLab株式会社


学んだ知見

  • 100人同時接続を実現するために
    • オブジェクトの再利用(newを抑える)
  • 同期ずれ
    • 重複した通知は最後の値のみ適用
  • アセットバンドルロード
    • ロードの優先度
      • UI > ミッションに関連するもの > カメラに近いプレイヤー
  • アセットダウンロード
    • 並列化, Rangeリクエス
      • データ量が増えてもがロード長くならない

講演概要

通信基盤の紹介

RPCクライアント(Remote Procedure Call)

  • [クライアント]c# メソッド実行 <-> goの関数実行[サーバ]

受信処理のチューニング

リアルタイムバトル実装

課題

  • スペックの差により、サーバから送られてくる通知をさばける量が違う

原因

  • 通知処理に1フレーム以上の時間がかかる
    • エフェクト周りが重い

対策

  • 不要な通知を無視する
    • サーバからの通知は上書き更新
    • 実行時刻が過去のものを無視

アセットロードの負荷軽減

課題

  • プリロードできない
  • 操作中のロード負荷

対策

  • priorityによるロード順の制御
    • UI、プレイヤー、敵の優先度
  • 操作中のロード不可の軽減
    • FPSに応じて並列ロード数を動的
  • instantiateの高速化
    • キャッシュ

アセットダウンロードの高速化

課題1

  • 進行に応じで都度DLができない
    • プレイヤーが何を装備しているかわからない

対策1

  • メインスレッドを使わない(WWW / UnityWebRequestを使わない)
    • メインスレッド非依存のHTTPライブラリ
  • コネクション数を増やす

課題2

  • まだファイル数に依存して時間がかかる

対策2

  • まとめてDLして受信後に展開


所感

  • 随時DLが使えない場合の対策としてとてもよくまとまっている内容だと思った
    • SINoALICEとの比較
  • HTTP/2を実装できない場合、こちらの対処法を使うことができればある程度緩和できそう