SlideShare una empresa de Scribd logo
1 de 98
リアルタイムリモートデバッグ環境による
ゲーム開発イテレーションの高速化
Haruto Otake
自己紹介
大竹 悠人 (Haruto Otake)
経歴
2009~2013 dwango
2013~ 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 - ポートフォワードツールのWrapper
adbや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.bootloader
devwireの利用では利用ケースが様々ある
Editor/Preview/実機, gRPC/gRPC以外
互いに同時に走ることがありうるのでポート番号を分離
ポート番号の解決とgRPCのServiceの管理をライブラリ化
サーバーの種別, 実行環境, 独自採番の番号から判断
利用側はポート番号を直接指定する必要が一切ないように
有線でのTCP/IPでの通信が可能になったら
その上で、TCP/IPベースのデバッグツール制作の敷居を下げる
TCP/IPでのデバッグツール制作の課題
TCP/IPでのデバッグツール制作を難しくしている原因
異常系を含めた扱い
プロトコル設計
クライアント・サーバー間の不整合が起こりがち
任意の処理を任意のパラメータで呼び出し結果を取得したいだけ
RPCフレームワークの導入が解決になる
デバッグツールの種別ごとに必要なものが変わる
インターフェースが静的なデバッグツール
処理内容がゲームそのものに依存しないものが主
ファイル転送/ヒエラルキー操作/ログなど、ゲーム開発に共通す
る軸で開発を手助けする汎用デバッグツール
インターフェースが動的なデバッグツール
処理内容がゲームそのものに依存するものが主
ゲームのパラメータを可変させるデバッグメニューなど
インターフェースが静的な
デバッグツール向けのRPC
インターフェースが静的なRPCへの要求
ポータビリティ
呼び出し側のツールの実装言語に制約を設けない
後方互換性があり、自由度の高い型定義
ツール間の依存性を適切に保ちつつ、複雑な構造も受け渡したい
実機をサーバーとして動作すること”も”出来る
処理を行う, 情報を送る主体がサーバーにならないと制御が難しい
gRPCの選定理由
ポータビリティ
対応言語が非常に多彩で、あり得る選択肢はほぼ網羅
後方互換性があり、自由度の高い型定義
Protobufを用いたIDLがあり、後方互換性も担保できる
実機をサーバーとして動作すること”も”出来る
Unity IL2CPPでgRPCサーバーとして動作させることが可能
ストリーミングもあるので、高度な制御も低コストで可能
インターフェースが動的な
デバッグツール向けのRPC
インターフェースが動的なデバッグツールのRPCへの要
求
実装によってインターフェースが定まる
処理を実装するのは主にゲーム開発チームのエンジニア
処理に合わせたインターフェースを手で定義する手間をなくす
実行できるタイミングは動的に定まる
実行できるタイミングが限られる処理も多数ある
フロントエンドは自動的に定まる
実装からフロントエンドは自動的に生成されるべき
gRPCは動的なデバッグツールには向かない
実装によってインターフェースが定まる
IDLを書いてコード生成を行う必要がある
実行できるタイミングは動的に定まる
実行できない処理を表明することはできない
フロントエンドは自動的に定まる
エコシステムを活かせば一部可能だが、エンジニア向け
ユースケース特化の動的なRPCを実装することにした
実装によってインターフェースが定まる
実行できるタイミングは動的に定まる
IDLを使わず、任意のタイミングでC#の実装を投げ込む
フロントエンドは自動的に定まる
Webの技術でデバッグメニューの汎用フロントエンドを生成
実機でもPCでも閲覧可能なデバッグメニューの実現
Retweak
HTTPサーバ + 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を、その名前とセットで保持
Callable
Retweakの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-editor
JSON Schemaからフォームを自動生成するコンポーネント
Objectや配列でも自在に表現できる
フロントエンドの構成
Google Analytics for Firebase
アクセス解析を埋め込んでデバッグメニューの使用統計を取る
FirebaseからBigQueryへExport
Google データポータルでダッシュボードを作成
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.cli
vfs同士のファイルコピーを行うCLIツール
仮想ファイルシステムの実現
Container
基準パス以下のファイルシステムを抽象化
最低限必要なファイルシステムへの操作を行える
ResourcePath
Container配下の正規化されたファイルパス
Router
Containerに名前を付けて保持できるコレクション
ゲームから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 / VfsRemotingClient
Routerと紐づくContainerをgRPCで外部から操作できるようにする
RemoteRouter / RemoteContainer
gRPC経由での操作を既存の実装と同じI/Fで扱えるWrapper
NFSのようにネットワークごしにファイルシステムをマウント可能
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 Reload
Unityの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!
Appendix
RetweakのC#動的コード実行環境
SlowSharpを用いてC#コードの動的実行を実現
Roslynで解析した構文木を動的に実行するC#インタプリタ
HTTP経由で渡されたC#コードを実行し、返り値はJSON化
Debug.LogによるログをServer-Sent EventでSPA側に通知
SPA側の編集UIにはMonaco Editorを採用
C#のシンタックスハイライトが多少効く
コードを実行するキーボードショートカットも登録
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】

Más contenido relacionado

La actualidad más candente

【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術Unity Technologies Japan K.K.
 
UniRxでMV(R)Pパターン をやってみた
UniRxでMV(R)PパターンをやってみたUniRxでMV(R)Pパターンをやってみた
UniRxでMV(R)Pパターン をやってみたtorisoup
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化DeNA
 
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnity Technologies Japan K.K.
 
UniTask入門
UniTask入門UniTask入門
UniTask入門torisoup
 
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミングUnity Technologies Japan K.K.
 
UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解したtorisoup
 
TDPT + VMCプロトコル on WebRTC
TDPT + VMCプロトコル on WebRTCTDPT + VMCプロトコル on WebRTC
TDPT + VMCプロトコル on WebRTChironroinakae
 
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜モノビット エンジン
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するTakahito Tejima
 
【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略Takayasu Beharu
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャtorisoup
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングSatoshi Kodaira
 
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック【Unite Tokyo 2018】Audio機能の基礎と実装テクニック
【Unite Tokyo 2018】Audio機能の基礎と実装テクニックUnityTechnologiesJapan002
 

La actualidad más candente (20)

【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
 
UniRxでMV(R)Pパターン をやってみた
UniRxでMV(R)PパターンをやってみたUniRxでMV(R)Pパターンをやってみた
UniRxでMV(R)Pパターン をやってみた
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
 
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
 
UniTask入門
UniTask入門UniTask入門
UniTask入門
 
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング
 
UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解した
 
TDPT + VMCプロトコル on WebRTC
TDPT + VMCプロトコル on WebRTCTDPT + VMCプロトコル on WebRTC
TDPT + VMCプロトコル on WebRTC
 
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
 
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
 
Visual Dataprepで建築データを美味しく下ごしらえ UNREAL FEST EXTREME 2021 SUMMER
Visual Dataprepで建築データを美味しく下ごしらえ UNREAL FEST EXTREME 2021 SUMMERVisual Dataprepで建築データを美味しく下ごしらえ UNREAL FEST EXTREME 2021 SUMMER
Visual Dataprepで建築データを美味しく下ごしらえ UNREAL FEST EXTREME 2021 SUMMER
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
 
【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
 
UE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろうUE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろう
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
 
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック【Unite Tokyo 2018】Audio機能の基礎と実装テクニック
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック
 
Fortniteを支える技術
Fortniteを支える技術Fortniteを支える技術
Fortniteを支える技術
 

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

01 idea table3.0
01 idea table3.001 idea table3.0
01 idea table3.0umisuzume
 
Windows 8 Developers カンファレンス
Windows 8 Developers カンファレンスWindows 8 Developers カンファレンス
Windows 8 Developers カンファレンスKaoru NAKAMURA
 
3Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.13Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.1ITDORAKU
 
3Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.13Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.1CRI Japan, Inc.
 
01 idea table3.1(up)
01 idea table3.1(up)01 idea table3.1(up)
01 idea table3.1(up)umisuzume
 
本の紹介
本の紹介本の紹介
本の紹介t w
 
情報理工Android勉強会第一回大将Part
情報理工Android勉強会第一回大将Part情報理工Android勉強会第一回大将Part
情報理工Android勉強会第一回大将PartHiroki Sakamoto
 
3Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.13Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.1ITDORAKU
 
Unityティーチャートレーニングデイ -認定3Dアーティスト編-
Unityティーチャートレーニングデイ -認定3Dアーティスト編-Unityティーチャートレーニングデイ -認定3Dアーティスト編-
Unityティーチャートレーニングデイ -認定3Dアーティスト編-Unity Technologies Japan K.K.
 
2018/3/23 Introduction to Deep Learning by Neural Network Console
2018/3/23 Introduction to Deep Learning by Neural Network Console2018/3/23 Introduction to Deep Learning by Neural Network Console
2018/3/23 Introduction to Deep Learning by Neural Network ConsoleSony Network Communications Inc.
 
Webプログラマの為のUnity入門
Webプログラマの為のUnity入門Webプログラマの為のUnity入門
Webプログラマの為のUnity入門Yusuke Ando
 
Windows8のクライアントHyper-V入門(.NETラボ勉強会 2013/6/22 日本マイクロソフト)
Windows8のクライアントHyper-V入門(.NETラボ勉強会 2013/6/22 日本マイクロソフト)Windows8のクライアントHyper-V入門(.NETラボ勉強会 2013/6/22 日本マイクロソフト)
Windows8のクライアントHyper-V入門(.NETラボ勉強会 2013/6/22 日本マイクロソフト)Tomokazu Kizawa
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介Mori Shingo
 
01 idea table3.2
01 idea table3.201 idea table3.2
01 idea table3.2umisuzume
 
devsumi2012 17-D-1 Kinectで創る10年後のカタチ
devsumi2012 17-D-1 Kinectで創る10年後のカタチdevsumi2012 17-D-1 Kinectで創る10年後のカタチ
devsumi2012 17-D-1 Kinectで創る10年後のカタチKaoru NAKAMURA
 
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発Developers Summit
 
Jenkinsを使おうよ
Jenkinsを使おうよJenkinsを使おうよ
Jenkinsを使おうよYohei Oda
 

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

01 idea table3.0
01 idea table3.001 idea table3.0
01 idea table3.0
 
Windows 8 Developers カンファレンス
Windows 8 Developers カンファレンスWindows 8 Developers カンファレンス
Windows 8 Developers カンファレンス
 
3Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.13Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.1
 
3Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.13Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.1
 
01 idea table3.1(up)
01 idea table3.1(up)01 idea table3.1(up)
01 idea table3.1(up)
 
本の紹介
本の紹介本の紹介
本の紹介
 
情報理工Android勉強会第一回大将Part
情報理工Android勉強会第一回大将Part情報理工Android勉強会第一回大将Part
情報理工Android勉強会第一回大将Part
 
3Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.13Dリッチコンテンツビジネス活用のご提案ver3.1
3Dリッチコンテンツビジネス活用のご提案ver3.1
 
Unityティーチャートレーニングデイ -認定3Dアーティスト編-
Unityティーチャートレーニングデイ -認定3Dアーティスト編-Unityティーチャートレーニングデイ -認定3Dアーティスト編-
Unityティーチャートレーニングデイ -認定3Dアーティスト編-
 
2018/3/23 Introduction to Deep Learning by Neural Network Console
2018/3/23 Introduction to Deep Learning by Neural Network Console2018/3/23 Introduction to Deep Learning by Neural Network Console
2018/3/23 Introduction to Deep Learning by Neural Network Console
 
Webプログラマの為のUnity入門
Webプログラマの為のUnity入門Webプログラマの為のUnity入門
Webプログラマの為のUnity入門
 
Windows8のクライアントHyper-V入門(.NETラボ勉強会 2013/6/22 日本マイクロソフト)
Windows8のクライアントHyper-V入門(.NETラボ勉強会 2013/6/22 日本マイクロソフト)Windows8のクライアントHyper-V入門(.NETラボ勉強会 2013/6/22 日本マイクロソフト)
Windows8のクライアントHyper-V入門(.NETラボ勉強会 2013/6/22 日本マイクロソフト)
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
 
01 idea table3.2
01 idea table3.201 idea table3.2
01 idea table3.2
 
devsumi2012 17-D-1 Kinectで創る10年後のカタチ
devsumi2012 17-D-1 Kinectで創る10年後のカタチdevsumi2012 17-D-1 Kinectで創る10年後のカタチ
devsumi2012 17-D-1 Kinectで創る10年後のカタチ
 
Indigo Studio で作るプロトタイプ
Indigo Studio で作るプロトタイプIndigo Studio で作るプロトタイプ
Indigo Studio で作るプロトタイプ
 
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
 
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
 
Ldd13 present
Ldd13 presentLdd13 present
Ldd13 present
 
Jenkinsを使おうよ
Jenkinsを使おうよJenkinsを使おうよ
Jenkinsを使おうよ
 

Más de DeNA

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

Más de DeNA (20)

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

Último

AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Último (8)

AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

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

Notas del editor

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