Movatterモバイル変換


[0]ホーム

URL:


SlideShare a Scribd company logo

リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】

Download as PPTX, PDF
7 likes1,967 views
DeNA
DeNA

本セッションでは、Unityを使った開発のイテレーション高速化を目的として、有線接続したモバイル実機のゲームに対して開発用PCからリアルタイムに介入できるツールを高い柔軟性で容易に開発できる基盤をgRPC等と独自TCPリレーサーバーを組み合わせて構築した事例と、その上に実現したファイル転送システムをはじめとした、具体的に構築したデバッグツールの事例をご紹介します。

1 of 98
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化Haruto Otake
自己紹介大竹 悠人 (Haruto Otake)経歴2009~2013 dwango2013~ DeNA主にUnity向けの内製ライブラリやSDK開発に従事
今日話すことUnity製のモバイルゲームを対象として• 実機デバッグツールの必要性と実現したデバッグツール• 実機デバッグツールを作る障壁とその解決策について
今回の発表で持ち帰って欲しいものDeNAが、実機デバッグという領域に対してどのような問題を見出したのかどのような課題を設定したのかどのような技術選択、アーキテクチャで課題解決をしたのか
アジェンダ実機デバッグツールで目指すゴール実機デバッグツールの実現を阻害する要因の分析実機デバッグツールを実現する環境の構築汎用的なデバッグツールの実現
実機デバッグツールで目指すゴール何の為に、何を目指すのか
実機デバッグの必要性Unity EditorのPreviewは高速だが、確認の精度が落ちるパフォーマンス問題, 改行位置, シェーダ, IL2CPP, 様々な闇…確認を怠るとダメージコントロールが難しいタイミングで表面化、障害に繋がる
実機デバッグは情報が少なく、イテレーションが遅いAssetBundleビルドとダウンロードが必要プレイヤーのビルド自体に多くの時間がかかるプレイヤーデータの状況再現も手間がかかるEditor Previewと隔絶した速度感であることが、実機確認の精度の低下につながる
目指す世界Editor Preview ≒ 実機
Unity Editorで編集中のSceneを実機ですぐ確認するUnityのSceneの実機ホットリロード専用のSceneを実機ビルドに含めて起動させておくUnity Editorで Alt+@ を押すと実機に反映
デモ左がUnity Editor右が実機画面https://youtu.be/uZYIHR6WBnM
このようなデバッグツールを積極的に作れるようにする一つのツールで全ての問題が解決できる訳ではない課題設定と解決の仕方を間違えると、問題解決に至らないツールを積極的に、容易に、誰もが作れる環境を作る純粋に問題に向き合いやすくなる
作りやすい環境の上で具体的なデバッグツールを実装するゲーム自体に依らない、費用対効果の高いツールを実装単体では問題を解決せず、解決の為の道具としてみるデバッグツール実装環境のモデルケースとしての意味も具体的な課題解決は使い手に任せる大枠なユースケースは想定する
Agenda実機デバッグツールで目指すゴール実機デバッグツールの実現を阻害する要因の分析実機デバッグツールを実現する環境の構築汎用的なデバッグツールの実現
実機デバッグツールの実現を阻害する要因の分析実機デバッグツールの問題分析と課題設定
デバッグ用の通信経路の不安定性配信サーバーを経由すると、利便性や速度が問題作業者ごとの環境の分離と、それに伴う接続先管理リアルタイム性に欠け、ホップ数が多い開発PCと実機の直接の通信経路が必要ファイル転送に耐える通信速度と安定性接続先という概念を考えないでも使いたい
実機との通信の現実的な選択肢有線(USBケーブル)利用できるツールがプラットフォーム毎に異なるツールが実現できることなら個別の実装は不要だが、制約が多い接続先の特定は容易無線(TCP/IP)TCP/IPなので幅広いツールをプラットフォームを区別せず使える目的ごとに個別の実装が必要だが、制約が少ない接続先IP,ポートの特定が煩雑
有線接続時のデバッグ用ツールadb有線, TCP/IP接続したAndroidデバイス用の開発ツールAndroid SDKにバンドルされているlibimobiledevice有線接続したiOSデバイス用の開発ツール&ライブラリOSS
adb, libimobiledeviceで出来ることゲームではなく、デバイスを制御するツール実機内のファイルシステムへのアクセスシステムログの表示TCPポートフォワードゲームへの個別の介入をするツールではない
有線接続時の問題実機OSごとにツールチェーンが異なるやりたいことが同じでもツールを使い分ける必要があるiOSではReverse Port Forwardが不可出来ることの制約が強いOSごとに実装が必要で、セキュリティ上の制約も強い基本的にはあるものを使うのが現実的
無線接続でのTCP/IP利用時の問題実機のIPアドレスを調べるのが煩雑IPアドレスという概念を理解していない人でも使えるべき通信品質が環境に依存する輻輳しやすく、アクセスポイントが近くにないと使えないVLANがあるとアクセスポイントが同じでも疎通しない可能性デバッグツール制作のハードルが高い1からTCP/IPのハンドリングをするのは危険だし、見合わない程の実装コストがかかる
有線, 無線両方の問題全ての解決を目指す実機OSごとにツールチェーンが異なる出来ることの制約が強い実機のIPアドレスを調べるのが煩雑通信品質が環境に依存するデバッグツール制作のハードルが高い
有線, 無線両方の問題全ての解決をするには…実機OSに関係なく単一のツールを用いる出来ることの制約が少ない実機のIPアドレスを調べる必要がない通信品質が環境に依存しないデバッグツール制作のハードルが低いこれらの要件を達成する必要がある
Agenda実機デバッグツールで目指すゴール実機デバッグツールの実現を阻害する要因の分析実機デバッグツールを実現する環境の構築汎用的なデバッグツールの実現
実機デバッグツールを実現する環境の構築
方針有線接続でTCP/IPを利用する出来ることの制約が少ない実機のIPアドレスを調べる必要がない通信品質が環境に依存しないツールのクロスプラットフォーム/ゼロコンフィギュレーション化実機OSに関係なく単一のツールを用いるRPCフレームワークの整備デバッグツール制作のハードルが低い
devwire有線接続 + TCP/IPの組み合わせの問題を解決するツールキットリバースポートフォワードの実現ツールの統一ポート番号の割り振りRPCによるデバッグツール実装の為のヘルパーScaffold, サービスのブートストラップ
有線接続でのTCP/IPの利用複数のパターンに対応できる必要がある実機がサーバーになる場合PCがサーバーになる場合行動する主体をサーバー、依頼する主体をクライアントにする実体と逆転すると複雑な制御が必要になる
実機がサーバーになる場合各OSのツールに存在するポートフォワード機能を利用これらを呼び分けることでクロスプラットフォーム化
devwire.forward - ポートフォワードツールのWrapperadbやlibimobiledeviceのツールを呼び分けるWrapper個別にプロセスを立ち上げてスーパーバイザとして振る舞う.NET Coreで実装。Win/Mac用のバイナリを抱え込む何も指定しなくても、起動するだけで利用可能既定値で必要なポートが全てフォワードされる接続しているデバイスのOSを自動的に検知
devwire.forwardによる実機側のサーバーへのアクセス
PCがサーバーになる場合ポートフォワードでは実機からPC上のサーバーを参照できないリバースポートフォワードが必要最近のAndroidならadb proxyが使えるが、iOSには存在しない独自にリバースポートフォワードを行うライブラリを実装する
devwire.gatewayクライアントが踏み台になる形のTCP over TCP Gatewayサーバー側のローカルホストへ通信を、クライアント側から接続可能な任意のホストにトンネリング実機をサーバーに、PC側をクライアントにする実機側からPC側への通信が可能にクライアントからサーバーへの接続にはdevwire.forwardを利用サーバー側でフォワード設定を宣言できるgRPCに限らず、TCPであればプロトコルを問わず中継可能
devwire.gatewayを利用したTCP/IPベースのツール利用
devwire.gatewayの利点利用範囲が広いクライアントから届く範囲であればどこでもフォワード可能TCPで片方向のフォワードができていれば、逆方向にできる相手のOSやプラットフォームを選ばない利便性が高いフォワード先を宣言的に定義できるのでPC側の指定が不要ポートフォワードの成立状態をゲーム側が知ることが出来る
devwire.gatewayの採用技術PoC(概念実証)をPure C#でクイックに実装最終的なPoCの設計を下敷きに、C++17に移植Unity以外のゲームエンジンでも利用可能Win / Mac / Android / iOSに対応。bazelでビルドC++のコア層に対してFFI層を用意してネイティブプラグイン化Unity用ライブラリ/PC用CLIツールのフロントエンドをC#で実装バイナリプロトコルはflatbuffers。libuv(uvw)でイベントループ化
devwire.bootloaderdevwireの利用では利用ケースが様々あるEditor/Preview/実機, gRPC/gRPC以外互いに同時に走ることがありうるのでポート番号を分離ポート番号の解決とgRPCのServiceの管理をライブラリ化サーバーの種別, 実行環境, 独自採番の番号から判断利用側はポート番号を直接指定する必要が一切ないように
有線でのTCP/IPでの通信が可能になったらその上で、TCP/IPベースのデバッグツール制作の敷居を下げる
TCP/IPでのデバッグツール制作の課題TCP/IPでのデバッグツール制作を難しくしている原因異常系を含めた扱いプロトコル設計クライアント・サーバー間の不整合が起こりがち任意の処理を任意のパラメータで呼び出し結果を取得したいだけRPCフレームワークの導入が解決になる
デバッグツールの種別ごとに必要なものが変わるインターフェースが静的なデバッグツール処理内容がゲームそのものに依存しないものが主ファイル転送/ヒエラルキー操作/ログなど、ゲーム開発に共通する軸で開発を手助けする汎用デバッグツールインターフェースが動的なデバッグツール処理内容がゲームそのものに依存するものが主ゲームのパラメータを可変させるデバッグメニューなど
インターフェースが静的なデバッグツール向けのRPC
インターフェースが静的なRPCへの要求ポータビリティ呼び出し側のツールの実装言語に制約を設けない後方互換性があり、自由度の高い型定義ツール間の依存性を適切に保ちつつ、複雑な構造も受け渡したい実機をサーバーとして動作すること”も”出来る処理を行う, 情報を送る主体がサーバーにならないと制御が難しい
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】
gRPCの選定理由ポータビリティ対応言語が非常に多彩で、あり得る選択肢はほぼ網羅後方互換性があり、自由度の高い型定義Protobufを用いたIDLがあり、後方互換性も担保できる実機をサーバーとして動作すること”も”出来るUnity IL2CPPでgRPCサーバーとして動作させることが可能ストリーミングもあるので、高度な制御も低コストで可能
インターフェースが動的なデバッグツール向けのRPC
インターフェースが動的なデバッグツールのRPCへの要求実装によってインターフェースが定まる処理を実装するのは主にゲーム開発チームのエンジニア処理に合わせたインターフェースを手で定義する手間をなくす実行できるタイミングは動的に定まる実行できるタイミングが限られる処理も多数あるフロントエンドは自動的に定まる実装からフロントエンドは自動的に生成されるべき
gRPCは動的なデバッグツールには向かない実装によってインターフェースが定まるIDLを書いてコード生成を行う必要がある実行できるタイミングは動的に定まる実行できない処理を表明することはできないフロントエンドは自動的に定まるエコシステムを活かせば一部可能だが、エンジニア向け
ユースケース特化の動的なRPCを実装することにした実装によってインターフェースが定まる実行できるタイミングは動的に定まるIDLを使わず、任意のタイミングでC#の実装を投げ込むフロントエンドは自動的に定まるWebの技術でデバッグメニューの汎用フロントエンドを生成実機でもPCでも閲覧可能なデバッグメニューの実現
RetweakHTTPサーバ + JSONSchemaベースのRPC + Webフロントエンド実装によってインターフェースが定まるC#のdelegateからJSON Schemaを生成してインターフェースに実行できるタイミングは動的に定まるデバッグコマンド毎に動的に付け外しが可能フロントエンドは自動的に定まるVueによるSPAとして汎用フロントエンドを実装JSON SchemaからWeb UIを自動生成
デモ左がWeb Browser右が実機画面https://youtu.be/FmNF_sow74E
スタンドアロン利用のデモ単純なデバッグメニューとして利用可能WebViewでSPAを表示https://youtu.be/ji-Ga-0Wu3Y
Retweakの設計Tweak一つのデバッグ項目の単位表示位置の仮想パスや、種別毎のメタ情報を保持複数のCallableを、その名前とセットで保持CallableRetweakのRPCの最小単位引数をJSONで与えると、返り値をJSONで受け取れる関数引数と戻り値のJSON Schemaとシリアライザと実際の実体
JSON Schemaの動的生成
Callableの実行
複数のCallableの活用
UIの生成
させたい処理に応じたTweakを定義Command任意の処理の実行させるTweakを生成するInspect / Modify任意の値を読み書きするTweakを生成するSlider, Toggle, Image最適化したUIを伴う任意の値を読み書きするTweakを生成する
単純な型から複雑な型まで幅広く取り扱える
画像やバイナリも取り扱えるスクリーンショット端末内データのzip化
フロントエンドの構成vue + vuex + vue-router + bootstrap-vueエンジニアのみでもそれなりのUIを作れるので用途に合う自然なパーマリンクとヒストリ管理も実現json-editorJSON Schemaからフォームを自動生成するコンポーネントObjectや配列でも自在に表現できる
フロントエンドの構成Google Analytics for Firebaseアクセス解析を埋め込んでデバッグメニューの使用統計を取るFirebaseからBigQueryへExportGoogle データポータルでダッシュボードを作成
HTTPサーバーのホスティング.NET FrameworkのHttpListenerクラスが利用可能簡易的なHTTPルーティングとリクエストハンドラ機構を実装Tweakを扱うAPIとSPAの静的コンテンツを同じホストで提供SPAの静的コンテンツはzipにして扱うStreamingAssetsに1ファイルを置くだけで使えるようにFirebaseなどの設定をAPI経由でSPA側に流し込む
デモの実コード
Retweakによる利点実機でもPCでも同じデバッグメニューを使えるBootstrapによるレスポンシブデザインUIの実装に豊富なフロントエンド資産を活用できるデバッグメニューを扱う際のUXを低コストで改善できるフロントエンドを柔軟にカスタマイズできる
ここまでで成し遂げたこと有線接続でゲームとツールが通信を自由に行える環境devwire.forward + devwire.gatewayの実装共通基盤となりえる静的なデバッグツールを作る環境gRPCの採用デバッグメニューにあたる処理をリモートで呼び出す環境Retweakの実装
Agenda実機デバッグツールで目指すゴール実機デバッグツールの実現を阻害する要因の分析実機デバッグツールを実現する環境の構築汎用的なデバッグツールの実現
汎用的なデバッグツールの実現
Vfs仮想ファイルシステムとデバイス間ファイル転送
モバイルゲーム開発におけるファイル転送の必要性モバイルゲームのアセットの殆どはインストール後の事後配信毎回アセットをアップロードが必須。サイズも巨大(GB単位)定期的なビルドでなく、手元でのトライアンドエラーには不向き作業者ごとの環境の分離も煩雑実機にアセットを直接転送することで解決できる
ファイル転送ソリューションとその課題libmobiledeviceやadb cpアクセスできるディレクトリに強い制限があるプラットフォーム固有のツールを使い分ける必要がある転送時に指定するパス表記が統一されていない
既存ソリューションの課題と解決のための要件プラットフォームのツール依存と設定の煩雑さの解決devwireを前提としたgRPCベースのツールにすることで解決アクセスできるディレクトリの制限の撤廃アプリのプロセス内でサービスとして動かすことで解決転送時に指定するパス表記の統一ファイルシステムを仮想化することで解決
vfs (Virtual File System)ファイルシステムの仮想化とネットワーク共有を実現するvfs.coreファイルシステムの仮想化と、パスの正規化vfs.remoting.core仮想化したファイルシステムをgRPC経由でマウント/公開vfs.clivfs同士のファイルコピーを行うCLIツール
仮想ファイルシステムの実現Container基準パス以下のファイルシステムを抽象化最低限必要なファイルシステムへの操作を行えるResourcePathContainer配下の正規化されたファイルパスRouterContainerに名前を付けて保持できるコレクションゲームからContainerの実体を隠す
ディレクトリのContainerとResourcePathへの抽象化Containerは特定のディレクトリを基準パスとして持つインターフェース上には実際のパスそのものは現れないResourcePathはContainerでは相対パスとして解決される
ResourcePath - 環境差を吸収するため、パスを正規化/path/to/directory/file.unity3d/path/to/directory//path/to/directory/path/to/../to/directorY/.や..によるパス内での相対パス表記は利用できないCase-Sensitiveディレクトリの区切りと終端必ず/で必ず/で始まる
Containerの実際の基準パスを外部から隠蔽する
Containerの外部公開によるファイル共有の実現VfsRemotingServer / VfsRemotingClientRouterと紐づくContainerをgRPCで外部から操作できるようにするRemoteRouter / RemoteContainergRPC経由での操作を既存の実装と同じI/Fで扱えるWrapperNFSのようにネットワークごしにファイルシステムをマウント可能
Containerの外部公開によるファイル共有の実現
共有されるファイルの識別VFRL (Vfs File Resource Location)Vfsで管理されたネットワーク上の任意のファイルを示す識別子vfs://local@localhost:1234/dir/file.unity3dスキーマ名コンテナ名ホスト名 + ポート番号対象のコンテナ下のResourcePath
コマンドライン版フロントエンドローカルと、任意のVFRLに対してのファイル操作を行えるCLI全てのファイル操作はContainerに対する操作として行うローカルファイルはその場で一時的なContainerを作成可能な操作ファイル/ディレクトリのmv, cp, ls, catなどの基本操作特定ディレクトリを公開するサーバーの起動
ネイティブ版Vfsの実装C++タイトルでvfsを使えるように、非Unity版を開発golangで実装、cgoでC++向けのインターフェース付きでビルド工数圧縮 & 技術実証少なくとも、デバッグツールでの利用には耐えられるランタイムが大きいが、デバッグ用途なら問題にはならないgrpc-goはpure goなので、Android, iOSでも動作するgomobileはAndroid版がJavaのI/Fなのでゲームでは使いづらい
柔軟な実機ファイル転送機構を実現できた一定の手順で相手を選ばずにファイル転送できるUnity以外からでもツールチェインを利用できるファイル転送という手間自体をなくすことも可能PC側のContainerを直接ゲームから使うこともできるゲーム側で高度なインテグレーションも可能
Scene Hot ReloadUnityのSceneのホットリロードの実現
Unity Editorで編集中のSceneの内容をすぐ実機で見たい実現の仕方は数あるが、根本的な要求は似ているゲーム側の準備が整えば、これ自体は難しくないビルド済みAssetBundleの転送で実現可能AssetBundleの導入タイミングは開発中期以降が多い準備が整ってなくても実現できる方法を用意する
Sceneそのものを実機に転送する方法1. キーボードショートカットやメニューでクリックで実行2. Editorで編集中のSceneを一時的なAssetBundleとしてビルド3. ビルドしたAssetBundleをgRPCで実機に送る4. 実機で受け取ったAssetBundleからSceneをロード実機にHot Reload Serverが動くSceneを含めるだけで実現可能
SceneのビルドSceneのビルドはScriptable Build Pipelineを利用スクリプトコンパイル結果はキャッシュしてできるだけ回避開いているSceneを全て個別のAssetBundleとしてビルドSceneから依存するアセットも全てAssetBundleに含める
ビルドしたAssetBundleを実機に送るEditorから実機にgRPCで接続全SceneのAssetBundleのバイナリとActiveなSceneの名前を送信
実機で受けったAssetBundleからSceneをロード1. 読み込み前に、読み込み済みのSceneを全てアンロード2. 受け取ったAssetBundleを全てロード3. AssetBundleからSceneを全てロード4. ActiveなSceneを切り替え
汎用的なホットリロード環境が実現できた汎用的だが、常に使えるものではないScene初期化処理の呼び出しを行う必要はあるゲーム側のScene管理と競合する可能性はあるゲーム側がSceneのAssetBundle化をしているのであれば不要開発の初期に少ない準備で気軽に使える手段
Agenda実機デバッグツールで目指すゴール実機デバッグツールの実現を阻害する要因の分析実機デバッグツールを実現する環境の構築汎用的なデバッグツールの実現
最後にこの発表の振り返りと、これからの展望
実機デバッグのイテレーション高速化の道具は十分整ったデバッグツールの実装環境の実現有線接続でゲームとツールが通信を自由に行える共通/ゲーム特化なデバッグツールを気軽に作れる汎用的なデバッグツールの実現柔軟なファイル共有手段という問題解決の武器を提供カジュアルなホットリロード機構の実現
これからの展望具体的な利用実績の積み上げ潜在的な需要をもっと吸い上げる汎用的なデバッグツールの拡充タイトルチームがやるべきことだけにより向かえるようにBlazor WebAssembly, Serverの活用ゲームコードとデバッグツール間のコード共有Electronと併せてインハウスツールの製作手段として検討
Thank you for listening!
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】
Appendix
RetweakのC#動的コード実行環境SlowSharpを用いてC#コードの動的実行を実現Roslynで解析した構文木を動的に実行するC#インタプリタHTTP経由で渡されたC#コードを実行し、返り値はJSON化Debug.LogによるログをServer-Sent EventでSPA側に通知SPA側の編集UIにはMonaco Editorを採用C#のシンタックスハイライトが多少効くコードを実行するキーボードショートカットも登録
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】
Ad

Recommended

PPTX
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
sairoutine
 
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
Unity Technologies Japan K.K.
 
PDF
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
Yoshiki Hayama
 
PDF
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
モノビット エンジン
 
PPTX
ゲームエンジニアのためのデータベース設計
sairoutine
 
PDF
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
historia_Inc
 
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
 
PDF
UniRx の1歩目
infinite_loop
 
PDF
テストとリファクタリングに関する深い方法論 #wewlc_jp
kyon mm
 
PDF
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
 
PDF
IL2CPPに関する軽い話
Wooram Yang
 
PDF
UniTask入門
torisoup
 
PDF
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
Yoshiki Hayama
 
PDF
目grep入門 +解説
murachue
 
PDF
実践イカパケット解析
Yuki Mizuno
 
PDF
Unityでオンラインゲーム作った話
torisoup
 
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
PDF
【Unite Tokyo 2019】Render Streaming - WebRTC を用いたストリーミングソリューション
UnityTechnologiesJapan002
 
PPTX
大規模ゲーム開発における build 高速化と安定化
DeNA
 
PDF
多機能ボイチャを簡単に導入する方法
Unity Technologies Japan K.K.
 
PDF
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
KLab Inc. / Tech
 
PDF
UniRx完全に理解した
torisoup
 
PPTX
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
DeNA
 
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
 
PDF
ゲームの仕様書を書こうまとめ
Sugimoto Chizuru
 
PDF
【Unity道場】VectorGraphicsで作る エモい表現
Unity Technologies Japan K.K.
 
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
PDF
Observableで非同期処理
torisoup
 
PDF
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
UnityTechnologiesJapan002
 
PDF
「龍が如く」も「スーパーモンキーボール」も自動化!クオリティエンジニアリングチームによるマルチゲームエンジン対応で進化した「龍が如くスタジオ」のテスト自動...
SEGADevTech
 

More Related Content

What's hot(20)

PDF
テストとリファクタリングに関する深い方法論 #wewlc_jp
kyon mm
 
PDF
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
 
PDF
IL2CPPに関する軽い話
Wooram Yang
 
PDF
UniTask入門
torisoup
 
PDF
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
Yoshiki Hayama
 
PDF
目grep入門 +解説
murachue
 
PDF
実践イカパケット解析
Yuki Mizuno
 
PDF
Unityでオンラインゲーム作った話
torisoup
 
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
PDF
【Unite Tokyo 2019】Render Streaming - WebRTC を用いたストリーミングソリューション
UnityTechnologiesJapan002
 
PPTX
大規模ゲーム開発における build 高速化と安定化
DeNA
 
PDF
多機能ボイチャを簡単に導入する方法
Unity Technologies Japan K.K.
 
PDF
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
KLab Inc. / Tech
 
PDF
UniRx完全に理解した
torisoup
 
PPTX
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
DeNA
 
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
 
PDF
ゲームの仕様書を書こうまとめ
Sugimoto Chizuru
 
PDF
【Unity道場】VectorGraphicsで作る エモい表現
Unity Technologies Japan K.K.
 
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
PDF
Observableで非同期処理
torisoup
 
テストとリファクタリングに関する深い方法論 #wewlc_jp
kyon mm
 
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
 
IL2CPPに関する軽い話
Wooram Yang
 
UniTask入門
torisoup
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
Yoshiki Hayama
 
目grep入門 +解説
murachue
 
実践イカパケット解析
Yuki Mizuno
 
Unityでオンラインゲーム作った話
torisoup
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
【Unite Tokyo 2019】Render Streaming - WebRTC を用いたストリーミングソリューション
UnityTechnologiesJapan002
 
大規模ゲーム開発における build 高速化と安定化
DeNA
 
多機能ボイチャを簡単に導入する方法
Unity Technologies Japan K.K.
 
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
KLab Inc. / Tech
 
UniRx完全に理解した
torisoup
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
DeNA
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
 
ゲームの仕様書を書こうまとめ
Sugimoto Chizuru
 
【Unity道場】VectorGraphicsで作る エモい表現
Unity Technologies Japan K.K.
 
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
Observableで非同期処理
torisoup
 

Similar to リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】(6)

PDF
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
UnityTechnologiesJapan002
 
PDF
「龍が如く」も「スーパーモンキーボール」も自動化!クオリティエンジニアリングチームによるマルチゲームエンジン対応で進化した「龍が如くスタジオ」のテスト自動...
SEGADevTech
 
PPTX
HoloLens参考書読書会 vol9
Shoji Oshima
 
PDF
【Unite2014】Unity Test Tools
cfm_art
 
PPTX
Unity * スマートフォン開発で学んだこと
Katsutoshi Makino
 
PPTX
DeNA TechCon2019 How to implement live streaming client using Unity
Takeyuki Ogura
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
UnityTechnologiesJapan002
 
「龍が如く」も「スーパーモンキーボール」も自動化!クオリティエンジニアリングチームによるマルチゲームエンジン対応で進化した「龍が如くスタジオ」のテスト自動...
SEGADevTech
 
HoloLens参考書読書会 vol9
Shoji Oshima
 
【Unite2014】Unity Test Tools
cfm_art
 
Unity * スマートフォン開発で学んだこと
Katsutoshi Makino
 
DeNA TechCon2019 How to implement live streaming client using Unity
Takeyuki Ogura
 
Ad

More from DeNA(20)

PPTX
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DeNA
 
PPTX
IoTと業務システムをつなぐgRPC/RESTサービスの開発と運用
DeNA
 
PPTX
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
DeNA
 
PDF
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
DeNA
 
PPTX
クラウド環境でのセキュリティ監査自動化【DeNA TechCon 2020 ライブ配信】
DeNA
 
PPTX
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeNA
 
PDF
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
DeNA
 
PPTX
DeNA データプラットフォームにおける 自由と統制のバランス【DeNA TechCon 2020 ライブ配信】
DeNA
 
PDF
MOV の機械学習システムを支える MLOps 実践【DeNA TechCon 2020 ライブ配信】
DeNA
 
PDF
コンピュータビジョン技術の実応用〜DRIVE CHARTにおける脇見・車間距離不足検知〜【DeNA TechCon 2020 ライブ配信】
DeNA
 
PDF
DeNA の Slack 導入と活用の事例紹介
DeNA
 
PPTX
タクシーxAIを支えるKubernetesとAIデータパイプラインの信頼性の取り組みについて [SRE NEXT 2020]
DeNA
 
PPTX
オートモーティブ領域における 位置情報関連アルゴリズムあれこれ
DeNA
 
PPTX
後部座席タブレットにおけるMaaS時代を見据えた半歩先のUX設計」 [MOBILITY:dev]
DeNA
 
PPTX
ドライブレコーダ映像からの3次元空間認識 [MOBILITY:dev]
DeNA
 
PPTX
MOVで実践したサーバーAPI実装の超最適化について [MOBILITY:dev]
DeNA
 
PPTX
MOV お客さま探索ナビの GCP ML開発フローについて
DeNA
 
PPTX
課題ドリブン、フルスタックAI開発術 [MOBILITY:dev]
DeNA
 
PPTX
DeNA の AWS アカウント管理とセキュリティ監査自動化
DeNA
 
PPTX
DeNAのQCTマネジメント IaaS利用のベストプラクティス [AWS Summit Tokyo 2019]
DeNA
 
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DeNA
 
IoTと業務システムをつなぐgRPC/RESTサービスの開発と運用
DeNA
 
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
DeNA
 
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
DeNA
 
クラウド環境でのセキュリティ監査自動化【DeNA TechCon 2020 ライブ配信】
DeNA
 
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeNA
 
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
DeNA
 
DeNA データプラットフォームにおける 自由と統制のバランス【DeNA TechCon 2020 ライブ配信】
DeNA
 
MOV の機械学習システムを支える MLOps 実践【DeNA TechCon 2020 ライブ配信】
DeNA
 
コンピュータビジョン技術の実応用〜DRIVE CHARTにおける脇見・車間距離不足検知〜【DeNA TechCon 2020 ライブ配信】
DeNA
 
DeNA の Slack 導入と活用の事例紹介
DeNA
 
タクシーxAIを支えるKubernetesとAIデータパイプラインの信頼性の取り組みについて [SRE NEXT 2020]
DeNA
 
オートモーティブ領域における 位置情報関連アルゴリズムあれこれ
DeNA
 
後部座席タブレットにおけるMaaS時代を見据えた半歩先のUX設計」 [MOBILITY:dev]
DeNA
 
ドライブレコーダ映像からの3次元空間認識 [MOBILITY:dev]
DeNA
 
MOVで実践したサーバーAPI実装の超最適化について [MOBILITY:dev]
DeNA
 
MOV お客さま探索ナビの GCP ML開発フローについて
DeNA
 
課題ドリブン、フルスタックAI開発術 [MOBILITY:dev]
DeNA
 
DeNA の AWS アカウント管理とセキュリティ監査自動化
DeNA
 
DeNAのQCTマネジメント IaaS利用のベストプラクティス [AWS Summit Tokyo 2019]
DeNA
 
Ad

Recently uploaded(8)

PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
 

リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】

Editor's Notes

  • #2: こんにちは。本セッションでは、リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化、という題で発表させていただきます。よろしくお願いします。
  • #3: スピーカーの自己紹介です。大竹悠人といいます。2013年からDeNAでゲームクライアントの基盤開発をメインに、横断的な仕事をしています。
  • #4: 今回は、Unityのモバイルゲームを対象として、ゲーム開発における実機デバッグツールの必要性と、実現したデバッグツールについてお話するのですが、特に、デバッグツールを作るための障壁とその解決策についてを重点的に話させていただきます。
  • #5: スライドは速やかに公開する予定になっています。詳細についてはそちらでじっくりご確認いただけますので、この時間ではDeNAが実機デバッグツールという領域に対して、どのような問題を見いだし、どのような課題を設定し、どのような技術選択・アーキテクチャでそれを解決したのか、という方法論の部分を持ち帰って頂ければと思っています。
  • #6: こちらがアジェンダになります。背景として、まず実機デバッグツールによって目指すゴールについて話していきます。
  • #8: 実機デバッグの前にそもそもUnityにはEditorでのプレビュー機能があります。確認の速さで言えばこれが最速ですが、実機でしか確認できないことも多いです。これらは日頃から十分に確認できていないと、大抵の場合つらいタイミングで表面化したり、そのまま見過ごされて障害につながっていきます。
  • #9: ですが、実機での確認は辛いです。アセット一つ変えるにもAssetBundleのビルドを待って、さらにダウンロードも行わなければなりませんし、プレイヤービルドも遅いです。望む状況のプレイヤーデータを作るだけでも、煩雑な操作を迫られます。自由が効くEditorでのプレビューとは、かなり隔絶した速度感での開発をいつも強いられることになります。このような環境下で確認を頻繁に行うのは、かなり辛いものがあります。
  • #10: ですので、Editor Previewで出来るような速度感の確認を、実機でも出来るような環境を、ゴールとして目指す必要があります。いきなりですが、先に具体的なデバッグツールのデモからお見せしようかと思います。
  • #11: お見せするのは、Unity Editorで編集中のSceneを実機でほぼリアルタイムに確認するツールのデモです。いわゆるSceneのホットリロードです。専用のSceneを実機ビルドに含めて起動しておくことで、UnityEditor上でショートカットを実行するだけでその場で実機に反映されます。
  • #12: 左がUnity Editorの画面、右が実機の画面になります。まずEditorでPlaneを作って、カメラに床として映るように配置します。配置したところでUnity Editorからホットリロードを行うと、実機側にも同様に床が写ります。次に、UnityちゃんのPrefabを床に乗るようにシーンに配置します。ここでまたホットリロードを行うと、Unityちゃんが実機にも表示されます。このUnityちゃんには操作用のコンポーネントがついているので、実機ですぐに操作することができます。
  • #13: いきなりデモをお見せしたわけですが、今回話していくのはこのようなデバッグツールを積極的に作れる環境作りに関してが主になります。全ての問題を解決できる都合のよいツールはありません。解決の仕方を間違えると、異なる形で問題を再生産するだけになりがちです。ツールを積極的に、容易に、誰もが作れる環境を作ることで、純粋に問題に向き合いやすい状況にしていく必要があります。
  • #14: ただ、全てを解決できなくても、問題解決の手段となるツールを実装しておくことで、各々の課題解決を楽にすることができます。これには実装環境自体のモデルケースとしての意味もあります。
  • #15: ここまでで、実機デバッグの重要性について、背景を話してきました。では、実機デバッグツールの実現を具体的に阻害している要因は何なのでしょうか。次に、その要因を分析していきます
  • #16: この章では、実機デバッグツールにまつわる周辺環境から問題を分析し、解決するべき課題を設定するまでを説明します。
  • #17: まず第一に、デバッグ用の通信経路の不安定性が挙げられます。サーバーを用意するようなフローでは、個人ごとの環境の分離や接続先管理の煩雑さが課題になります。できれば、開発用PCと実機の間に直接な通信経路を用意できると、速度の面でも利便性の面でも非常に都合が良いです。
  • #18: 実機との通信経路を確保しようとすると、現実的な選択肢として、USBでの接続と, WiFiでの無線を経由したTCP/IPでの接続の2パターンがあります。有線は利便性は高いのですが、制約が多く、プラットフォーム依存も激しいです。無線では制約やプラットフォーム依存が少ない一方、実装も煩雑で利便性も低いです。
  • #19: 有線接続時の接続時に使えるツールとしては、Android用のadbとiOS用のlibimobiledeviceがあります。
  • #20: これらを使うと、ファイルシステムへのアクセスやシステムログの表示、TCPポートフォワードが可能になりますが、これらは直接ゲームに介入するようなツールではありません。
  • #21: また、問題として実機のOS毎にツールを呼び分けるのは面倒ですし、出来ることに差異や制約が多いです。
  • #22: 無線でTCP/IPを用いる場合には、IPアドレスを調べないと使えなかったり、通信環境への依存が激しかったり、そもそもTCP/IPを喋るツールを万人が書くのはコストがかかりすぎるという問題があります。
  • #23: このように、双方様々な問題がありますが、全て解決していいとこ取りが出来る環境を今回は目指しました。
  • #24: ですので、問題をひっくり返したこれらが今回実現する環境の要件になります。
  • #25: 次に、この要件を具体的に実現する環境について順番に説明していきます
  • #27: 実機デバッグツールの実現を容易にする環境を作るための方針として、3つの決定をしました。まず、経路としては物理的接続の安定性と論理的接続のポータビリティを両立させるために、有線接続でTCP/IPを利用すること。次に、ツールをクロスプラットフォームで、おまけにゼロコンフィギュレーション運用できる形で提供すること。最後に、デバッグツール製作のコスト削減の為にRPCフレームワークを整備することです。
  • #28: 実機デバッグツールを実現する環境の構築のために、devwireという名前のプロダクトを作りました。主な役割は有線接続時とTCP/IPを組み合わせた際に生じる問題を解決することにあります。また、RPCによるデバッグツール実装の為のヘルパーの役割も持っています。
  • #29: 有線接続でTCPを使う場合、実機がサーバーになる場合とPCがサーバーになる場合の二通りがあります。基本的になにかアクションを行う主体がサーバーになり、依頼する側がクライアントにならないと、ツールの構造は非常に煩雑になってしまうので、これらを適切に使い分けられる必要があります。
  • #30: 実機がサーバーになる場合は、各OSのデファクトのツールが利用できます。これらを呼び分けるだけでクロスプラットフォーム化は果たす事ができます。
  • #31: これを実現するプロダクトとして、devwire.forwardを作りました。具体的な処理は各ツールに移譲していて、スーパーバイザとして振る舞う単純なものですが、devwireが規定するポートを利用する上であれば、単に起動するだけで利用できるようになっています。
  • #32: これを利用した時の通信はこのようになります。実機側でListenしているポートをPC側のポートにフォワードして、そこを接続先とすることで実機上のデバッグツールのサーバーに対してPCから通信を行えます
  • #33: PCがサーバーになる場合はどうでしょう。この場合は、少々問題があります。Androidであれば問題ないのですが、iOSでは実機側からPC側でlistenしているポートにフォワードすることができません。このため、プラットフォームに依らずにリバースポートフォワードを行うライブラリを実装することにしました。
  • #34: これを行うのが、devwire.gatewayです。devwire.gatewayはサーバーとクライアントの2つで構成され、クライアントが踏み台になり、サーバーがその利用側になるという形のTCP over TCP Gatewayになっています。これを利用して、実機をサーバーに、PC側をクライアントにすることで、実機側からPC側への通信が可能になります。このdevwire.gateway自体の通信はdevwire.forwardでポートフォワードをする前提にしています。ポートの組み合わせは複数登録でき、コネクションも複数張れるので、gRPCに限らずTCPであれば何でも利用できます。
  • #35: これを利用したときの通信はこのようになります。実機で実行するサーバーでは、予めローカルのポートと、フォワード先のホストとポートの3つをセットにして登録します。サーバー側にクライアントから接続されると、予めサーバー側で宣言したPort Z, YのListenが開始されます。このポートに接続があると、サーバーはクライアントに対してフォワード先の設定に従って接続を行うように要求します。クライアントはこの接続先に対して接続し、内部的なコネクションIDを発行します。以後、クライアントとサーバーは端末側のPort Z, Yがそれぞれのフォワード先のポートと同様に振る舞うようにデータを全て中継します。
  • #36: devwire.gatewayの利点は、まず利用範囲の広さがあります。フォワード先のホストがVMやdockerであってもフォワードすることも可能で、片方向のポートフォワードができる状況下であれば両方向のポートフォワードを実現できます。また、Unity以外での利用も視野に入れて作っているので、動作するOSやプラットフォームを選びません。利便性の面でも、実機側でフォワード先を指定しておくことができるので、PC側で都度接続先の指定が必要ありません。また、ソフトウェア実装なので、ポートフォワードが成立している状態なのかをゲーム側からAPI確認することができます。
  • #37: devwire.gatewayはまずPure C#で概念実証版をクイックに実装してから、C++17に移植する形をとりました。C++17で本実装したのは、Unity以外のゲームエンジンでも利用できるようにするためです。一見二度手間ですが、C++で実装した後の手戻りをかなり下げることが出来ました。本実装版は、C++17でコアを実装した上で、FFI層を作ってネイティブプラグイン化して、実機用のライブラリとPC用のコマンドラインツールのフロントエンドをC#で実装するという形をとっています。コア部分はlibuvを使ったシングルスレッドモデルで、flatbuffersをバイナリプロトコルとして利用しています。
  • #38: ここまでで、有線でTCP/IPを使うための下地は整いました。しかし、devwireの利用シチュエーションを考えると、どの場合でもポート番号が被らないように運用す必要があります。このため、ポート番号の解決やgRPCサービスの管理をライブラリ化し、サーバーの種別や実行環境,独自採番の番号を与えるとポート番号を解決できるようにして、利用者やツール実装者がポート番号を直接意識しないで済むようにしています。
  • #39: 有線でのTCP/IPの利用自体に問題がなくなっても、デバッグツール製作の敷居の高さの問題は残っています。あとはこれを解決する必要があります。
  • #40: TCP/IPでのデバッグツール製作が難しいのは、異常系の扱いやプロトコル設計が煩雑で、プロトコルの不整合による問題も起こりがちでかつ原因究明のコストが高いことにあります。デバッグツール用途であれば、任意の処理をリモートで呼び出せれば事足りるので、RPCフレームワークの導入が解決になります。
  • #41: ですが、デバッグツールにはインターフェースが静的なデバッグツールと、動的なデバッグツールの2つに分けることができると思います。前者はゲームそのものに依存しないデバッグツールが主で、例としては、ファイル転送を始めとした、ゲーム開発に共通する軸で開発を手助けするものが上げられます。後者はゲームそのものに依存するデバッグツールが主で、例としては、デバッグメニューから呼び出すような処理が挙げられます。これらの2つの種類のデバッグツールに、それぞれ適切なRPCフレームワークを用意する必要があります。
  • #42: まず、インターフェースが静的なデバッグツール向けのRPCについてです。
  • #43: 要求としては、3点あります。まず、呼び出し側の実装言語に制約を設けないポータビリティがあること。これはゲームに依存しない汎用デバッグツールは、呼び出し元が人間ではなく、別のツールであることも多いからです。次に後方互換性のあり、自由度の高い型定義が可能なこと。後方互換性が担保されていないと、ツール間の依存が激しくなってしまいますし、複雑な構造を受け渡せないとRPCのための実装コストがかさんでしまいます。最後に、実機をサーバーとして動作すること”も”できること。これは、処理を行ったり、情報を送る主体がサーバーにならないと、その制御が非常に複雑になり、実装コストとなってしまうためです。
  • #44: これらを満たす選択肢として、gRPCを選定しました。
  • #45: gRPCはRPCフレームワークとしては業界標準ですし、今回求めていた要求もこのようにすべてクリアしていました。
  • #46: 次に、インターフェースが動的なデバッグツール向けのRPCはどうでしょうか。
  • #47: 要求は以下の3点です。実装によってインターフェースが定まること。これは処理を記述するのがゲーム開発チーム側のエンジニアになるので、実行させたい処理以外に考えるべきことは極力少なくなっている必要があります。次に、実行できるタイミングが動的に定まること。これは、それぞれの処理を受け付けられる画面が限定的であることが多いためです。最後に、フロントエンドは自動的に定まること。フロントエンドをゲーム開発チームのエンジニアに処理ごとに書かせるわけにはいきません。なので、これも実装から定まる必要があります。
  • #48: これらの要求に対して、gRPCでは答えることができません。先程は利点であったことが、逆に働いてしまいます。
  • #49: ですので、この領域に対しては、これらを満たすRPC機構を独自に作ることにしました。IDLを使わず、本質的に動的にメソッド定義のできるRPC機構を作り、Webの技術でデバッグメニューとしての汎用フロントエンドを作ることで、実機内でもPCでも閲覧可能なデバッグメニューを実現する、というのを目標としました。
  • #50: このために作ったのが、Retweakです。RPCはHTTPサーバー機能とJSON SchemaベースのRPCによって実現しています。引数や戻り値の型情報から、JSON Schemaを自動生成しています。フロントエンドはvue.jsを使ったSingle page applicationとして実装しています。RPCから得られたJSON Schemaを元にUIを自動生成することで、個別のフロントエンド実装を不要にしています。
  • #51: Retweakのデモをお見せします。左がWebブラウザの画面で、右が実機の画面です。実機とはdevwire.forwardを使って接続しています寿司増加というメニューを開いてスライドバーをいじると、実機上の寿司のパーティクルの量が増えていきます。寿司回転をいじると、寿司が回転していきます。このように、ブラウザをデバッグメニューとして使うことができます。
  • #52: WebView上でもこのデバッグメニューは表示可能です。単に、WebViewで同じURLを開くだけで実現できます。
  • #53: Retweakは、TweakとCallableという2つの大きな概念を軸に設計しています。Tweakは1つのデバッグ項目を構成する単位で、表示に使われる仮想パスやメタ情報と、Callabeというものをその名前とセットで複数保持します。CallableはRetweakにおけるRPCの最小単位です。引数をJSONで与えると、返り値をJSONを返す関数のように振る舞います。引数や戻り値のJSON Schemaと、元の関数に対応するシリアライザ、そして元の関数の実体で構成されます。
  • #54: Callableに使うJSON Schemaは関数の実体からリフレクションでMethodInfoを得て、仮引数名と型情報から動的に生成されます。シリアライザやデシリアライザも同様に動的に生成されます。
  • #55: 作られたCallableを呼び出す際には、引数をデシリアライズして、関数を呼びだし、返り値をシリアライズするという処理が内部で透過的に行われます。
  • #56: Tweakは複数のCallableを保持できますが、主だったところでは値を扱うTweakの実現に利用されています。WebUIからgetterのCallabeを呼び出して初期値を取得してUIに反映し、UI上で操作した結果をsetterを呼び出すことでゲームに反映しています。
  • #57: UIはJSON Schemaから生成されます。TweakがもつCallableから引数のJSON Schemaを取得し、その内容を元にフォームを自動生成しています。
  • #58: Tweakにはいくつか種類があります。Commandは任意の処理を呼び出したいだけの場合に、InspectやModifyは値を読み書きしたい場合に、SliderやToggleやImageは、それぞれ最適化された汎用UIを伴う値を扱い場合に利用します。Tweakの定義は、新規に追加することも容易にできるようになっています。
  • #59: 生成されるUIの一例です。単純な型から、Dictionaryなどを含む複雑な型まで幅広く扱えます。
  • #60: 画像やバイナリも扱えるので、端末のスクリーンショットをとって保存することもできます。
  • #61: フロントエンドはこのような構成で、タイトル側で拡張することも可能にするべく、エンジニアのみでもそれなりのUIを作れるようにしました。JSON Schemaからのフォームの自動生成はjson-editorというライブラリを用いています。かなり多彩な構造を扱うことができます。
  • #62: また、フロントエンドではFirebaseも利用しています。現状ではアクセス解析を埋め込んで、デバッグメニューの使用率統計を算出できるようにしています。
  • #63: HTTPサーバーのホスティングは、.NET FrameworkのHttpListenerクラスを利用しています。これだけではAPIを伴うSPAを構築するには不十分なので、簡易的なルーティングとリクエストハンドラ機構を実装しています。設定の流しこみなどもAPI経由で行い、SPAの静的コンテンツは扱いやすいように1つのzipファイルの中身を直接HTTP上にマウントできるようにしています。
  • #64: デモを実現している実コードも掲載したので、気になる方は資料を後ほどご確認ください。
  • #65: Retweakに利用によって、様々なメリットが得られます。まず、PCからも実機からも同じデバッグメニューを活用でき、同時にそれぞれの利点を活かすことができます。UIの実装にuGUIでなくWebのフロントエンド資産を活用できるため、UXの向上が非常に低コストで出来るようになりますし、フロントエンドのカスタマイズも柔軟に行えます。
  • #66: ここまでで、有線接続でゲームとツールが自由に通信に行える環境をdevwire.forwardとdevwire.gatewayで構築し、静的なデバッグツールの構築手段としてgRPCを、動的なデバッグツールの構築手段としてRetweakを用意しました。
  • #67: これにより、実機デバッグツールを実現する環境を構築することができました。続けて、汎用的に使えるデバッグツールを、少し具体的な問題に切り込んで実装していきます。
  • #69: まず、仮想ファイルシステムとデバイス間ファイル転送についてです。
  • #70: 実機でのイテレーションを高めようと思った時に大きな課題になるのは、モバイルゲームのダウンロードコンテンツの多さです巨大なファイルを毎回アップロードするのも手間ですし、作業者ごとの環境の分離も煩雑です。これは、実機にアセットをファイルとして直接転送できれば、非常に汎化した解決が可能になります。
  • #71: 既存システムでファイル転送を行おうとすると、adbなどを使って転送することになります。この場合、アクセスできるディレクトリが限られたり、プラットフォーム毎のツールや指定するパスの使い分けが非常に煩雑になります。
  • #72: これらの課題は、もちろんdevwireの利用を前提とした上で、アクセス範囲の制限回避をアプリと同じプロセス内のサービスとすることで回避し、パス表記の問題はベースディレクトリを独自に抽象化して、仮想ファイルシステム化することで解決することにしました。
  • #73: そうして作ったのが、vfsです。vfsはファイルシステムの仮想化を実現し、それを生かしてファイルシステムのネットワーク共有を可能にします。ネットワーク共有を可能にした上で、それを生かしてファイル転送を実現しています。
  • #74: 仮想ファイルシステムは、大きく分けてContainer、ResourcePath, Routerの3つで実現しています。Containerはあるベースディレクトリ以下のファイルシステムを抽象化し、ResourcePathがContainer以下のファイルのパスを具体的に示します。ContainerはRouterに登録されることでシステムに認識され、ゲーム側は名前に応じたContainerをRouterから利用します。
  • #75: Containerは特定のディレクトリパスを基準パスとして持ちますが、実際のパスはインターフェースには現れません。vfsの中では、全てResourcePathを使って解決します。
  • #76: ResourcePathはこのように、決定性の高い形で正規化されます。パスの扱いというのはOSによって大小さまざまな差があります。必ず正規化するようにすることで、この差による実装の複雑化や問題を最小化することができます。
  • #77: これを活かすことで、コンテナの実際の基準パスを外部から隠蔽することができます。assetsとbannerのコンテナは全く違うベースパスを持っていますし、プラットフォーム毎にパスは異なりますが、外部からはContainer名とResourcePathだけでファイルを特定することができます。
  • #78: この仮想化されたファイルシステムであるContainerをgRPC経由で公開することで、ファイル共有を可能にします。仮想化されたファイルシステムを生かして、ネットワークの向こう側のRouterやContainerを透過的に扱えるインターフェースを用意しています。これによって、リモートのファイルシステムのマウントを可能にしています
  • #79: 実際の利用はこのようなイメージです。これはPC上のファイルシステムを端末にマウントする例になります。ゲーム側はRemoteContainerを経由してファイルアクセスを行いますが、RemoteContainerはgRPCを経由して、PC側で公開されているContainerからファイルをオンデマンドに取得して、端末内にそのContainerがあるかのように振る舞います。端末側のローカルファイルシステムのコンテナをPC側に公開することで、PCからのファイル転送を行うことも出来ます。
  • #80: ネットワーク上で共有されるファイルには、URIにあたるものとしてVFRLというフォーマットを定義しています。これによって、任意のホストの任意のコンテナの任意のファイルを識別することができます。
  • #81: VFSではファイル転送に用いるコマンドライン版のフロントエンドを用意していて、その中でもVFRLは利用されています。転送先や転送元のパスとして、VFRLを指定することができます。全てはコンテナ間の操作として実現しているので、異なる端末間でのファイルコピーなども可能です。また、コマンドラインからVFSサーバーを立ち上げることもできるようになっています。
  • #82: VFSの開発にあたって、非Unityのタイトルでも要望があったため、ネイティブ版のvfsも別途実装しました。こちらは工数圧縮と技術検証を兼ねて、golangで実装を行い、cgoでC++向けのインターフェースを定義してモバイルOS向けにクロスコンパイルしました。結果としては、デバッグツール実装目的なら少なくとも十分利用可能でした。grpc-goはpure goで実装されているため、Android, iOSでも全く問題なく動作します。既存のゲーム側の依存関係に影響されずにgRPCベースのツールを導入できる、というメリットもありました。
  • #83: このように、VFSによって、相手を選ばす、マウントも転送も可能で柔軟な実機ファイル転送機構を実現できました。
  • #84: 次に、UnityでのScene Hot Reload機構の事例について話します。
  • #85: Unity Editorで編集中のSceneを実機ですぐに確認したい、根源的な欲求です。AssetBundle化してあればファイル転送によって比較的楽に実現できますが、そうでない状況下でも概ね使えるソリューションを用意したい、という動機で実装しました。
  • #86: Sceneの実機への汎用的な転送は、その場で一時的なAssetBundleを作って送り込めば実現できます。Editor側でのアクションに応じてそれを行い、実機側のホットリロードサーバーにAssetBundleを送り込むという形でこれを実現しました。
  • #87: Sceneのビルドは、SBPを使っています。コードの変更はどのみちSceneの転送では反映できないので、スクリプトコンパイルの回避によってかなりの高速化が可能になります。1つのAssetBundleに入れられるSceneは1つだけなので、開いているSceneを全て個別にビルドします。Sceneから依存しているアセットも全てそれらのAssetBundleに含ませています。
  • #88: 転送はdevwireを前提として、gRPCで行います。全てのバイナリと、ActiveなSceneの名前を送ります。
  • #89: あとは、実機は受け取ったAssetBundleを使って、適宜Sceneを読み替えてホットリロードを行うだけで完了です。
  • #90: これにより、汎用的なホットリロード環境を実現できました。Sceneの初期化処理を個別に考慮しているわけではないので、その辺の考慮は必要ですし、AssetBundle化が進んだ後は確認の精度ももちろん下がります。ですが、これらを行っている場合は単にファイル転送で同じことが可能になるので、あくまで少ない準備で、表面的な動きだけでも気軽に実機の挙動を確認できる手段として対象を絞っています。
  • #91: これで汎用的なデバッグツールの実現について、一通りの説明を終えました。
  • #92: 最後に、今回の発表をまとめます。
  • #93: 今回達成したことで、課題解決の道具は十分に整えることができたと言えます。デバッグツールの実装環境を整え、汎用的に使えるデバッグツールを実現してその利用の実例も示すことができました。Editor Previewと同等とまでは行きませんが、その距離を近づけることには成功したかと思っています。
  • #94: これからの展望としては、まだ採用タイトルは少ないので、実タイトルでの利用実績をより積み上げて需要をもっと吸い上げていきます。その上で汎用的なデバッグツールも適宜拡充して、タイトルチームがやるべきことにより向かえる環境を作り上げていきます。技術的なところでは、Blazorの活用がインハウスツールやデバッグツールの実現手段としてメリットがありそうなので、検討を進めていきます。
  • #95: 以上で終わります。ご清聴、ありがとうございました。

[8]ページ先頭

©2009-2025 Movatter.jp