大規模開発のための Luminous Engine の ログ分析と自動テスト

大規模開発のための Luminous Engine の ログ分析と自動テスト

大規模開発のための LUMINOUS ENGINE の ログ分析と自動テスト 株式会社 Luminous Productions 岩﨑 浩 自己紹介 • 岩﨑 浩 Hiroshi Iwasaki – Luminous Productions http://www.luminous-productions.com/ – プログラムセクション ディレクター FINAL FANTASY XV MONSTER OF THE DEEP FINAL FANTASY XV © 2016 SQUARE ENIX CO., LTD. All Rights Reserved. MAIN CHARACTER DESIGN:TETSUYA NOMURA LOGO ILLUSTRATION:© 2016 YOSHITAKA AMANO ©2019 Luminous Productions CO.,LTD. Agenda • LUMINOUS ENGINE 紹介 主に機能紹介 • ログ分析と自動テスト の概要 • ログ分析 15分(目標) • プレイログ 機械学習の話とか • 自動プレイ ©2019 Luminous Productions CO.,LTD. What’s © 2016-2019 SQUARE ENIX CO., LTD. All Rights Reserved. ©2019 Luminous Productions CO.,LTD. MAIN CHARACTER DESIGN:TETSUYA NOMURA コリジョン C#スクリプト ナビメッシュ レベルエディタ キャラツール グラフィックス テラインツール AI LUMINOUS ENGINEの構成 VFX アニメーション UI アセットブラウザ アセットビルド Mayaプラグイン DevOps © 2016-2019 SQUARE ENIX CO., LTD. All Rights Reserved. MAIN©2019 CHARACTER Luminous DESIGN Productions:TETSUYA CO.,LTD. NOMURA ログ分析と自動テスト 概要 ©2019 Luminous Productions CO.,LTD. QA or デバッグで 大変な所 ©2019 Luminous Productions CO.,LTD. QAで大変なところ • 繰り返すのが大変 – 必須ルート、サブクエストの通しプレイ – 全ハードウェアで同じ内容をチェック • 多数のパターンを網羅するのが大変 – 全部のアイテムを検証 – 様々なセーブデータが正常にロードできるかの確認 – マップ全域を、いろいろな時間、天候で、確認 ©2019 Luminous Productions CO.,LTD. デバッグで大変なところ • どこでバグっているか見つけるのが大変。 – ほとんどの場合、原因を見つける方が、直すより大変です。 • バグを再現するのが大変。 – 再現性が低い、とか。 – 再現する手順が大変、とか。 ©2019 Luminous Productions CO.,LTD. 自動化したいこと 繰り返し 自動プレイ パターンの網羅 スクリプト実行 発生した 原因の特定 バージョンの特定 再現 リプレイ ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. Webサーバーの役割 • ログや自動テストの可視化です。 ©2019 Luminous Productions CO.,LTD. Webサーバー の機能紹介 ©2019 Luminous Productions CO.,LTD. テスト結果一覧 ©2019 Luminous Productions CO.,LTD. テスト結果の一覧 ©2019 Luminous Productions CO.,LTD. テストが失敗したバージョンを特定 ©2019 Luminous Productions CO.,LTD. テストが失敗する原因となった更新を特定 誰のSubmit? Submitのコメント テストが失敗した時に、 どのSubmitからバグが起きるようになったか?がわかる。 ©2019 Luminous Productions CO.,LTD. 各種、レポート パフォーマンス スクショ(2D) クラッシュした場所 JIRAチケットの場所 スクショ(パノラマ) 現在プレイされている場所 ©2019 Luminous Productions CO.,LTD. 過去の履歴 2019/6/15 2019/7/16 2019/8/5 すべてのログは、過去の情報も見られます。 ©2019 Luminous Productions CO.,LTD. グラフィックスの単体テスト ©2019 Luminous Productions CO.,LTD. テストに失敗したときのレポート Microsoft Teams での通知 前回と見た目が変わっていたら通知 ©2019 Luminous Productions CO.,LTD. アセットごとのスクショ&履歴 ©2019 Luminous Productions CO.,LTD. Webサーバー の仕組み ©2019 Luminous Productions CO.,LTD. 全体の図 influxdb アプリケーション開発者が 記述可能 定義ファイル Python (JSON) 自前 カスタム Flask python JavaScript ブラウザ ©2019 Luminous Productions CO.,LTD. エディタ 定義ファイル カスタム (JSON) JavaScript ブラウザ上で、 編集し、確認が可能。 ©2019 Luminous Productions CO.,LTD. Webサーバーの機能、動画 ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. テストサーバーの役割 • いろいろなテストを実行します。 ©2019 Luminous Productions CO.,LTD. テストの記述の言語 ©2019 Luminous Productions CO.,LTD. テスト記述の言語 外部(ホストPC)で動作 実機で動作 C# C++ python C# with “Python for .NET” Visual Script .NET Frameworkに アクセス可能な言語なら、 RPC 何でもOK ©2019 Luminous Productions CO.,LTD. エンジンのスクリプトサポート LM_FUNCと書くと、 エンジンがサポートする 全てのスクリプトからアクセス可能になります。 こんな感じで使える。 ©2019 Luminous Productions CO.,LTD. Pythonでの記述例 スクショを取って、 前回の結果と比較 の例 ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. スケジューラの役割 • テストを実行するタイミング、条件などを制御します。 • どのマシンで実行するか?なども制御します。 ©2019 Luminous Productions CO.,LTD. スケジューラ バックエンドは Jekinsを使っています。 実行条件などは、自前のスクリプトです。 ©2019 Luminous Productions CO.,LTD. スケジューラの構成 Test A 実行命令 Test B 実行命令 実行命令 マスター Job Test C 前半実行命令 実行 Job テスト実行命令を 実際に 最小単位に分解 テストを実行する Test C 後半実行命令 ©2019 Luminous Productions CO.,LTD. マスター Jobの役割 例えば、デイリーテストを実行 という命令に対して、 ・何のテストを、 ・どのプラットフォームで、 ・どのマシンでテストするか? を分解し、 複数の実行Job に投げます。 ©2019 Luminous Productions CO.,LTD. 実行Jobの役割 • 複数のマシンがアサインされています。 • JenkinsのLabelを使って、実行するマシンの制御を行っ ています。 ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. ログ サーバー&ホストの役割 • ログを永続的に記録します。 ©2019 Luminous Productions CO.,LTD. ログの構成 実機 ログホスト 実機 influxdb Local Server ©2019 Luminous Productions CO.,LTD. ログの取り方 • 各種スクリプトにコードを仕込むことで、ログが記録されま す。 • ログは、InfluxDB に永続的に記録されます。 – ある程度古いのは間引いて消しています。 ©2019 Luminous Productions CO.,LTD. C#でログを取る例 Measurement(テーブル)の Performance.FPSに value, pos, angleというFieldで保存されます。 ©2019 Luminous Productions CO.,LTD. DBに書き込んだ内容を、 先ほどのWebで可視化します。 ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. プレイログとは? ©2019 Luminous Productions CO.,LTD. リプレイログとは? • ゲームをリアルタイムに記録する目的に特化したログです。 – 今まで紹介したInfluxDBで取るログとは別の仕組み です。(連携はできますが) ©2019 Luminous Productions CO.,LTD. プレイログ 開発の動機 ©2019 Luminous Productions CO.,LTD. あの1フレに 何が起きたかを知りたい。 ©2019 Luminous Productions CO.,LTD. プレイログ開発の動機 • コリジョンが抜けた。 • キャラが突然消えた。 • 扉を開けたら、いるはずのキャラがいなかった。 • 今、立つはずのないフラグが立っている。 その瞬間、 何が起きていたのかを知りたい! ©2019 Luminous Productions CO.,LTD. 後からじゃ遅い。 常に、全部 記録しておく! ©2019 Luminous Productions CO.,LTD. プレイログでできること。 ©2019 Luminous Productions CO.,LTD. プレイログを使ったデバッグ ©2019 Luminous Productions CO.,LTD. プレイログの仕組み 色々な システム プレイログ プレイログ 色々な システム システム ポインタを 自動で比較して、 登録しておきます。 変わった値を記録します。 ©2019 Luminous Productions CO.,LTD. ログを取っているパラメータ • エンジンが認識できるゲームのプロパティ全部。 – Visual Scriptの実行履歴やプロパティの変化 – ゲームオブジェクトのプロパティ • 座標、ゲームステートなど。 • パッド入力 • パフォーマンス、プロファイル情報 – スパイクが起きたフレームを分析するため • ユーザーが指定したパラメータ ©2019 Luminous Productions CO.,LTD. プレイログに登録するコードの例 • この例では、カメラのView Matrix, Projection Matrixのリプレイログを取る、と言う指定です。 • あとは、エンジンが勝手に毎フレーム、差分を記録し続け ます。 ©2019 Luminous Productions CO.,LTD. プレイログで できること ©2019 Luminous Productions CO.,LTD. プレイログでできること • 過去の値の確認 • 過去のフレームのプレビュー • 過去の任意のフレームからのリスタート • グラフによる履歴の可視化 • 保存/読み込み • 機械学習の入出力に使う (後述) ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. 自動プレイに 期待すること ©2019 Luminous Productions CO.,LTD. 自動プレイの種類 自動で、今まで行われたことのないプレイをしてくれる。 発見的自動プレイ 過去に、一度行ったプレイを、繰り返し実行してくれる。 リプレイ的自動プレイ 今回はこちらの話 ©2019 Luminous Productions CO.,LTD. リプレイ的 自動プレイの手法 ©2019 Luminous Productions CO.,LTD. リプレイ的自動プレイの手法 • パッド入力を記録 • スクリプトで制御 パッド、と言っていますが、 もちろん、キーボードでもマウスでもタッチパネルでも同様です。 ©2019 Luminous Productions CO.,LTD. パッド入力を記録するメリット • 非常に高い汎用性 – ゲームの種類を問わず、入力を記録するリプレイは動 作します。 • リプレイのデータを用意するのが直感的 – 普通にプレイしたのを記録すれば良い。 • そのリプレイで再現したバグは、必ずユーザーも再現可能 – リプレイで行われた操作はパッドのみなので。 ©2019 Luminous Productions CO.,LTD. パッド入力を記録するデメリット • リプレイが安定しない – 何かの拍子に、少しでもずれると、使い物にならない。 • ⾧時間の通しプレイをパッド入力だけで、再現するには、 相当の仕込みが必要。 – ランダム要素の排除、エンジンとしての、結果の安定 性、など。 ©2019 Luminous Productions CO.,LTD. スクリプトで制御のメリット • ⾧時間の通しプレイも再現可能。 – 人力でスクリプトを組むので、がんばり次第で、何とで もなる。 ©2019 Luminous Productions CO.,LTD. スクリプトで制御のデメリット • 作るのが直感的ではない。 – プログラマ的作業。 • スクリプト制御特有のバグが起こりえる。 – 実際のユーザーのプレイとは若干違う。 • メンテコストが高い。 • 汎用性が低い。 ©2019 Luminous Productions CO.,LTD. パッド入力のリプレイが 安定すれば 最高 ©2019 Luminous Productions CO.,LTD. パッド入力のリプレイが安定しない理由 • 毎回、同じ結果にならないエンジン側の問題 • ランダム要素という、ゲーム側の問題 問題を取り除き、 維持し続けるのは、 難しい! ©2019 Luminous Productions CO.,LTD. リプレイがずれないように、がんばるのではなく、 一度ずれても、復帰できるように がんばった方が、よさそう。 ©2019 Luminous Productions CO.,LTD. マシンラーニングで やってみる。 ©2019 Luminous Productions CO.,LTD. 用語 記録したパッド入力を そのまま再生したリプレイ パッドリプレイ マシンラーニングを使った リプレイ ラーニングリプレイ ©2019 Luminous Productions CO.,LTD. ラーニングリプレイの結果 ©2019 Luminous Productions CO.,LTD. マシンラーニング の中身 ©2019 Luminous Productions CO.,LTD. ニューラルネットワークです。 以下、NN ©2019 Luminous Productions CO.,LTD. マシンラーニングの中身 • 何を学ばせるか? 色々な システム プレイログ プレイログ 色々な システム システム これを使います。 ©2019 Luminous Productions CO.,LTD. プレイログの中身 ゲームの状態を保存した データ列 ・・・ フレーム番号 N-2 N-1 N N+1 N+2 N+3 この中にはパッド入力も含まれています。 時系列のデータ ©2019 Luminous Productions CO.,LTD. ゲームの実際の進行 ・・・ N-1のパッド Nのパッド N+1のパッド N-1 の状態 N の状態 N+1 の状態 ©2019 Luminous Productions CO.,LTD. 何を学習するか? 今回の目的はQA用途のリプレイなので。 NNの出力は、パッド入力であるべき。 ここは? ここは、パッド入力 ©2019 Luminous Productions CO.,LTD. 何を学習するか? ・・・ N-1のパッド Nのパッド N+1のパッド N-1 の状態 N の状態 N+1 の状態 このゲームの状態を NNの入力に使います。 ©2019 Luminous Productions CO.,LTD. 何を学習するか? 解釈を変える Nのパッド Nのパッド N の状態 N+1 の状態 N の状態 NとN+1の差分 ©2019 Luminous Productions CO.,LTD. 何を学習するか? Nのゲーム状態と N+1への差分 パッド入力 ©2019 Luminous Productions CO.,LTD. 学習データ の用意の仕方 FPSが60の場合、1秒に60個の学習データが作れます。 プレイログ 早回しをすればもっと作れます。 先ほどの動画は、約20万のデータを学習させたものです プレイにして1時間くらいの分量。 普段のプレイログは使わず、 学習用の専用のプレイセットを用意しています。 ©2019 Luminous Productions CO.,LTD. 学習データを作成している様子 ©2019 Luminous Productions CO.,LTD. リプレイは何を保存するのか? ・・・ 学習済みNNが既にあるとして。 N-1 の状態 N の状態 N+1 の状態 これが、今回のリプレイで 保存&再生につかうデータです。 ©2019 Luminous Productions CO.,LTD. リプレイをどう再生するのか? フレームNを再生する場合 フレームNの パッド入力を求める 保存されたN+1 と、 の 状態 の状態の差分 ©2019 Luminous Productions CO.,LTD. ニューラルネットワークの構成 • 入力 • 出力 – キャラの座標 – スティックの傾き (4個) – キャラの早さ – ボタンの押し具合 (8個) – カメラの向き など ©2019 Luminous Productions CO.,LTD. ニューラルネットワークの構成(一例) • 3層で、ノード数は64の全結合。 • Dropoutは0.2 • 正則化はL2 (0.001) • 活性化関数は、ReLU • 入力データは事前に正規化。 ©2019 Luminous Productions CO.,LTD. 参考1 横軸:実際の値 縦軸:予測値 ©2019 Luminous Productions CO.,LTD. 参考2 横軸:予測値と実際の値との差分 縦軸:数 ©2019 Luminous Productions CO.,LTD. 参考3 青が、実際のデータ オレンジが、予測値 弱い入力は改善の余地あり ©2019 Luminous Productions CO.,LTD. 参考3 青が、実際のデータ オレンジが、予測値 ©2019 Luminous Productions CO.,LTD. エンジンとの連携 プレイログ プレイの巻き戻し パッドリプレイ プレイログ ゲーム システム ラーニングリプレイ 全部、プレイログのシステム経由で行います。 ・ゲームの値を取得して、NNに渡す ・NN結果をゲームに反映する など。 ©2019 Luminous Productions CO.,LTD. エンジンとの連携 プレイログ プレイの巻き戻し パッドリプレイ プレイログ ゲーム システム ラーニングリプレイ

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    150 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us