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

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

[Unite2019] 大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~

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

竹原 涼 株式会社セガゲームス
山田 英伸 株式会社セガゲームス


学んだ知見

結論:HTTP/2でのダウンロードがおすすめ


講演概要

HTTP/2特徴

  • stream多重化(TCP)
    • HTTP/1.1は6コネクションくらい
    • HTTP/2は100以上が推奨
      • レスポンスを待たずに通信が可能
  • ウィンドウサイズ制御(TCPのウィンドウサイズではない)
    • 受信バッファあふれを防ぐ
  • ヘッダ圧縮
    • HPACKフォーマット(ヘッダサイズが減る)
  • バイナリフレーム
    • 通信データがテキストデータからバイナリに

ダウンロード特性の解説

HTTP/1.1では帯域を使い切れない

  • 小さいファイルの転送では帯域が余る
  • HoLBの仕様

帯域を無駄にしないHTTP/2

  • 転送が終了したらすぐ別のストリームが開始される
  • ストリームが複数動いたら帯域を分配する
  • HoLB解消
    • リクエストを送りながらレスポンスを受け取れる

HTTP/2の弱点

  • 下層がTCPのためパケット欠損でHoLBが発生しうる

HoLBはHTTP/3で解決?
まだドラフトの状態

HTTP/2通信の実装の注意点

  • c#ではHTTP/2を使えるモジュールが存在しない
  • objective c / javaを利用するとこでiOS, Androidの対応は可能
    • ただしwindowsの対応ができない

そのため登壇者はc/c++で実装した

2019/8現在もc#で利用できるモジュールは存在してない


所感

  • アセットバンドルのDLを高速化したい場合はこの方法が良いとおもいました
  • ただし開発工数がそれなりに掛かりそうなので要注意
  • 今後HTTP/2対応が進んだ場合は優先的に対応を進める価値はありそう