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

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

[Unite2019] 『SINoALICE -シノアリス- 』〜 それは最速のゲーム起動 〜

動画・スライド:なし

中原 雄一 株式会社ポケラボ


学んだ知見

  • ゲーム開始時のロードが重い(データ量が多い、数が多い)場合は、
    必要な場面で随時ダウンロードするようにするとよい
    • 起動の高速化
    • 開発のサイクル高速化
    • API通信料金の削減
  • UXを工夫することで体感時間を削減できる効果が見込める

講演概要

開発環境

  • Unity 2018.4.2f1
  • middle ware
    • Spine(2D animation)
    • SPARK gear(3D effect)
    • CRIWARE

対策前、対策後の紹介

起動時間:2分→5秒に短縮

ゲーム起動シーケンス紹介

  • ログイン処理
  • ユーザーデータのDL
  • マスターのDL
    • マスタごとにAPIを実行(80種類)
    • ローカルに保存(SQLite
  • AssetBundleのチェック&DL
    • アイコン、キャラSpine、敵Spine、バトルエフェクト、バトル背景、バナー、その他
  • ResourceFileのチェック&DL
    • AssetBundle化していないバイナリ(CRIWARE系のファイル)
    • 動画、BGM、SE、キャラボイス、シナリオボイス

余談
アプリサイズは150MB以下を指標としている

ボトルネック紹介

  • マスタDL
    • 種類が多すぎる(80種類)
    • 一部マスタのサイズが大きい
      • カード(4MB) パラメータ
      • エスト(10MB) 敵、報酬
      • シナリオ(5MB) ストーリー
  • AssetBundle DL
    • アイコン(4500種類) → ゲーム起動時
    • Spineなど → 随時
  • ResourceFile DL
    • ゲーム起動時にDL
    • ボトルネック
      • シナリオボイスの数
      • ファイルチェック回数
      • 動画の容量

対策内容紹介

マスタDL

そのそもの管理の仕方

  • 各マスタはバージョン管理マスタで管理

更新方法

  • エクセルからSQL作成
  • 管理画面で入力
    • 事前に解析
    • 差分表示
    • 適用
      • バージョン管理マスタも同時に更新

ロードの処理フロー

  • バージョンチェック
    • リクエス
      • ローカルに保存しているマスタID配列
      • バージョン配列
    • レスポンス
      • 差分があるマスタID配列
  • 必要なマスタ取得
  • ローカルに保存

ボトルネック

  • マスタの種類
    • ゲーム起動時にまるごと取得するのをやめる
    • 必要なときに必要な分だけDL
  • 既存APIのレスポンス内にマスタを含める
  • サイズが大きい
    • 使用していないマスタをフィルタリングして返す
      • マスタ上の有効期限(startTime, endTime)で管理
    • アプリで参照してないデータをフィルタリング
      • サーバーで除外して返却

AssetBundle DL

アイコン
起動時にDL → 随時DLに変更

  • アイコン表示部分をすべて対応
  • 図鑑などアイコンが複数並ぶ画面は表示を行いながら非同期でDL
  • キャッシュクリアなどを行うとアイコンが徐々に表示される挙動になるがそれは許容する

ResourceFile DL

  • シナリオボイス
    • 随時DLに変更
  • ファイルチェック回数
    • 更新があったときのみチェック&DL
      • ResourceFile管理マスタで管理する
        • id, file_name, size, md5_key
      • マスタ生成は自動化
        • git pullしたタイミングでjenkinsで実行
  • 動画
    • 再生する場所で随時DL
    • 過去イベントの動画はDLしない
    • 動画管理マスタで管理
      • id, play_scene, place, start_time, end_time

プログレスバーの表現の工夫

以下のように変更
DL完了したファイル数 / DLするファイル数
→ DLした容量 / DLする容量
System.Net.WebClient.DownloadProgressChangedを併用)

表現の工夫

  • キャラ紹介画像削除
    • タイトルタップしたらマイページへ遷移
    • 新規キャラが増えたときとみ表示

まとめ

  • マスタ
    • 起動時にロードするデータを少なく
    • ロードするマスタは小さく(使っていないデータをフィルタリング)
  • AssetBundle, ResourceFile
    • 随時DL方式にして分散すさせる
    • ファイルチェックも時間がかかるので不要にIOアクセスを走らせない
    • プログレスバーで表現の工夫をする

効果

  • お客様に喜んでもらえた
  • 新規インストールのDL料が減った
  • CDN料金が減った
  • 開発のPDCAが早くなった

今後チャレンジしたいこと

  • バックグラウンドDL
  • 一括DL、随時D選択
  • 動画のストリーミング再生
  • プログレスバーなどのUX工場

所感

  • 考えればそうなるよなという話だった
  • UXの話が興味深かった
  • 他の講演では随時DLの方法をとらない紹介がいくつかあったので、消極的な対処法という印象を受けた