O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO

692 visualizações

Publicada em

今年3月に発売されたFINAL FANTASY XV WINDOWS EDITIONでは、マルチプレイ実装にPhoton Serverを採用しています。コンソールのバージョンとも親和性が高く、なんと約1週間で動作するところまで到達しました!

本セッションでは、FF15内でのパケット送信のカスタマイズやマルチプレイ特有の実装、バックエンドサーバーの構成などのご紹介に加え、Photonのイントロダクションと最新情報も合わせてご案内いたします。内容の濃い45分間、ご期待ください!

Publicada em: Tecnologia
  • Seja o primeiro a comentar

FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO

  1. 1. FINAL FANTASY XVにおける Photon利用事例 Photon運営事務局
  2. 2. 講演者ご紹介
  3. 3. 荒牧 岳志 株式会社 Luminous Productions
  4. 4. 櫟 香菜 Photon運営事務局
  5. 5. アジェンダ • Photonイントロダクション by 櫟 香菜 • FINAL FANTASY XVでのPhoton利用事例 by 荒牧 岳志 • PhotonServerよくあるお問い合わせ~まとめ by 櫟 香菜 *登壇順掲載、敬称略
  6. 6. Photonイントロダクション
  7. 7. “Photon”をご存知ですか?
  8. 8. Photonは ネットワークエンジン です! ~マルチプレイを簡単に実装できるソリューション
  9. 9. Photonの紹介 • マルチプレイを実現するために必要 な機能を一通り持っているツール • サーバーとクライアントSDKをセッ トで提供 • クライアント(=プレイヤー)間の通信 を簡単に実現するためのシステム • サーバーは接続性を確保するための もので、基本的に処理を行うのはク ライアント • WebHooksやPluginを利用してカス タマイズも可能 Photon Client Client Client SDK SDK SDK
  10. 10. Photonの主な機能 • ロビー – 名前付ロビー – マッチメイキング – プレイヤー検索 • ルーム – 人数制御・表示制御 – カスタムプロパティ • 同期関連 – オブジェクト同期 – イベント通知 – RPC (PUN) • WebHooks /WebRPC • オフラインモード
  11. 11. Photonの特徴 • サーバー経由なので接続性が高い – P2Pにありがちな問題は発生しない • 独自技術による信頼性と低レイテンシー の両方を確保 • クロスプラットフォーム対応で異なるプラット フォーム間でも利用可能 • UnityからはAsset Storeからダウンロードするだ けでSDKの利用が可能
  12. 12. Photonを利用した世界展開 • 世界12リージョンを利用可能 • 海外リージョン設置も可能なことに より、マルチプレイゲームの 世界展開も容易に! Regions Hosted in Asia Singapore Australia Melbourne Canada, East Montreal Europe Amsterdam India Chennai Japan Tokyo Russia Moscow Russia, East Khabarovsk South America Sao Paulo South Korea Seoul USA, East Washington USA, West San José
  13. 13. Photonのサービス形態 クラウド型サービス Photonのサーバーを サービス提供元が運用 ミドルウェア型サービス Photonのサーバーを ユーザー自身が運用 簡単に実装~サーバー管理はお任せ! カスタマイズ自在!自社運用にも!
  14. 14. Photon Server とは • Native C++で書かれたオンプレミス型の クロスプラットフォームマルチプレイヤー ゲーム開発フレームワーク • R-UDP/WebSocket/TCP/HTTP など対応 • Plugin開発に対応 • 対応OSはWindowsServerのみ • クライアントSDKはPhotonCloud利用時 相当の各種プラットフォームに対応
  15. 15. Photon Server を選ぶということ PhotonServerを選ぶということ、たとえば・・・ - IPもののタイトルで外出し厳禁 - ゲームロジックをServerサイドにのせなければ - サーバーサイドの詳細な監視をしたい
  16. 16. • クラウド型サービス • サーバーはサービス提供元で 運用 • クライアントにSDKを組み込 むだけで利用可能 • CCU数、トラフィック量など ダッシュボードで確認可能 • ミドルウェア型サービス • ソフトウェアとしてご提供、 お客さまで運用 • サーバーサイドのカスタマイ ズが自由に~Plugin • サーバのパフォーマンスデー タ取得可能 • サーバサイドにゲームロジッ クを乗せることが可能 →自由度がかなり増す Cloud VS. Server
  17. 17. PhotonServerを使いたい!となったら・・・ • まずはフリーアカウントで! • CCU数、ルーム/ロビー数、など数値のチェック • サーバ準備/環境の選択 Windows Server のみの対応です! クラウドを選択されるお客様が多いようです。AWS,Microsoft Azure,GCP,アプリクラウド・・・ • ライセンス購入 • ライセンス適用/利用開始! *クライアント側の開発ももちろん必要です Client Client Client SDK SDK SDK → 続いてFINAL FANTASY XVにおけるPhoton利用事例ご紹介!
  18. 18. FINAL FANTASY XVにおけるPhoton利用事例 株式会社 ルミナスプロダクションズ リードプログラマ 荒牧 岳志
  19. 19. FINAL FANTASY XV WINDOWS EDITION
  20. 20. FF15のマルチプレイ機能
  21. 21. マルチプレイの クロスプラットフォーム 通信はクロスプラットフォーム
  22. 22. なぜPhotonを使用したのか?
  23. 23. ミドルウェアに欲しかった機能 • 欲しかった要件 • ロビータイプのマッチングができる • マッチングの仕組みをカスタマイズできる • ルームやプレイヤーにカスタムプロパティができる • UDPなど通信の仕組みを備えている • 通信で到達保証 (Reliable)の仕組みを備えている • 実装期間がなかった • 10月から実装開始して1月にはQA終了
  24. 24. ミドルウェアの選択 • なぜ Photonを使用したのか? • スクウェア・エニックス内の社内実績が多い • マッチングだけでなく、通信の仕組みを備えている • デフォルトLoadBalancingサーバーが高機能 • 実装が簡単だった • 1週間で仮実装・・・ • 問題なく動いた!
  25. 25. FINAL FANTASY XV 1週間でのPhoton組み込み
  26. 26. Luminous Engine ライブラリ構成 FF15 ゲームクライアント ゲームエンジン Multiplayer Library 他プラットフォー ム マルチプレイ ライブラリ Photon
  27. 27. 実装 • PhotonはC++のバージョンを使用 • クラスおよびコールバックの実装が必要 • ExitGames::LoadBalancing::Client LoadBalancingClient • ExitGames::LoadBalancing::Listener • 実装に必要なC++ソースコードは1000行ほど
  28. 28. Photonのクライアントの流れ 初期化 ロビーに入る ルーム検索 ルーム作成or入室 マッチング・メンバー情報取得 ゲームプレイ
  29. 29. 1.初期化 初期化 ロビーに入る ルーム検索 ルーム作成or入室 マッチング・メンバー情報取得 ゲームプレイ サーバーアドレス設定して接続 (リージョンxメイン・バックアップ) LoadBalancingClient.connect() コールバックの設定 ExitGames::Common::Base::setListener() 通信パラメータの設定 LoadBalancingClient.setSentCountAllowance(7); LoadBalancingClient.setLimitOfUnreliableCommand s(40); LoadBalancingClient.setQuickResendAttempts(3);
  30. 30. 2.ロビーに入る 初期化 ロビーに入る ルーム検索 ルーム作成or入室 マッチング・メンバー情報取得 ゲームプレイ ロビーは、接続時に自動でログイン LoadBalancingClient.setAutoJoinLobby(true)
  31. 31. 3.ルーム検索 初期化 ロビーに入る ルーム検索 ルーム作成or入室 マッチング・メンバー情報取得 ゲームプレイ const auto& roomList = LoadBalancingClient.getRoomList(); for (uint32_t i = 0; i < roomList.getSize(); i++) { auto* room = roomList[i]; if (room->getIsOpen()) { int codeNumber = getRoomProperty(room, L"codeNumber"); int coopType = getRoomProperty(room, L"coopType"); … ランダムマッチでは、こちらが望むマッチングがで きなかったため、ルームリストを取得して検索
  32. 32. 4.ルーム作成・入室 初期化 ロビーに入る ルーム検索 ルーム作成or入室 マッチング・メンバー情報取得 ゲームプレイ ランダムマッチでは、こちらが望むマッチングがで LoadBalancingClient.opCreateRoom LoadBalancingClient.opJoinRoom ルームのカスタムプロパティを設定
  33. 33. Photonのクライアントの流れ 初期化 ロビーに入る ルーム検索 ルーム作成or入室 マッチング・メンバー情報取得 ゲームプレイ joinRoomEventActionコールバックで処理
  34. 34. Photonのクライアントの流れ 初期化 ロビーに入る ルーム検索 ルーム作成or入室 マッチング・メンバー情報取得 ゲームプレイ 毎フレーム LoadBalancingClient.service() 他メンバーへのデータ転送 (バイト配列) LoadBalancingClient.opRaiseEvent<nByte*>(r eliable, (nByte*)data, dataSize, PEAR_DATA, options) 他メンバーからのデータの受け取り opCustomEventAction(int playerNr, nByte eventCode, const Object& eventContent)
  35. 35. カスタムプロパティ • ルーム • クエストのID • リージョン • ルームオーナー情報 • プレイヤー • UIに表示用のプレイヤー名 • プレイヤーのキャラ情報
  36. 36. Photon UDP • Photonは、UDP/TCPなどを通信モードを切り替えが可能 • TCPでゲーム通信は微妙なので、UDPにしてパフォーマンスを上げたい • TCPで動作したが、UDPで動作しなかった • 1秒当たりのReliableパケットの数が多かった 1000パケットほど ⇒サーバーのReliableのパケット数が増え続ける • 1フレームで送信するパケットを一つにまとめて、自前で圧縮処理 (1024バイト 単位)
  37. 37. 通信量 • 1フレーム 2~3パケット 1秒当たり120~200パケット • 1人当たり100kbps~200kbps • 300kbps データ量多いな!
  38. 38. Photonは必ずリレー • Photonの通信は、必ずサーバーを経由する • モバイルアプリだとメリットが多いが・・ • PCだと、直接PC間通信ができる環境も多い • サーバーの負荷が高くなるとサーバー台数が多く必要 Photon サーバー
  39. 39. ピアツーピア(P2P)通信の検討・実装
  40. 40. P2Pの検討 • ピアツーピア(P2P) • 直接PC間でPhotonを経由せず、通信する • マッチングはPhotonを使い、PC間はWinSockを使用 • P2Pの実装には2つの要素が必要 • Reliable RUDP • NATトラバーサル(NAT越え)
  41. 41. Reliable UDP(RUDP)の実装 • 実装は3日、1000行程度のソースコード • 内部実装に普通のUDPソケットを使用 • 全てのパケットにヘッダー(8byte)を付ける • 送信タイプ・データサイズ・シーケンス番号 • 受け取り側は パケットを受け取ったらACTを送信側へ返す • 送信側は、一定時間ACTが来なかったら再送処理をする //送信タイプ enum struct RUDPSendType { Reliable = 0, //到達保証 / 順番保 証 Arrival = 1, //到達保証 Sequential = 2, //順番保証 Normal = 3, //単なるUDP };
  42. 42. NATトラバーサル • LAN環境で直接通信するにはIPアドレスの解決が必要 • IPv4 • ルータのIPとローカルのIPを分けて解決する必要がある • 通信する際に、ルータのIPアドレス・ポートが必要 • ポートが時間で自動的に閉じてしまうのを対応が必要 • IPv6 • 全てのデバイスに固有のアドレスが振られる • 対応している環境がすくない • IPv4の環境で、IPv6を使用するトンネリング技術がある
  43. 43. Microsoft Teredo技術 (IPv6) • Windowsでデフォルトで使用可能 • Microsoftのサーバーを通して、各PCに自動的にIPv6アドレスを振ってく れる • WinSock APIで通信可能 • 利点 • Windows10 XboxLiveなどで使用されている • 欠点 • オフィスなどのセキュリティの固いルータの場合、定期的にポートが変わったば あいに、IPアドレスも一緒に代わってしまう • 一部のノートPCでSecure IPv6 UDPパケットでブルスクリーンの症状
  44. 44. IPv4 NATトラバーサル • UPnP (Windows API) • ゲームクライアントから ルータに使用するポートを知らせて ポートをオープンしてもらう • セキュリティの問題などから UPnPを使用できないように していることが多い • STUNサーバー • 外部にSTUNサーバーを立てて STUNサーバーに IPアドレス・ポートを調べてもらう ルータ インターネッ ト ルータ STUN サー バー IP: x.x.x.x Port : xxxx インターネッ ト IP: x.x.x.x Port : xxxx
  45. 45. PhotonとP2Pの併用 IPアドレスが グローバル? ルータが UPnP対応? PC間通信 P2Pを使用 Photon経由で 通信 Yes No No No STUNサーバーによ るアドレス検索が 可能? No Yes Yes Yes UDP 2302ポートで送 受信できる? No
  46. 46. P2PとPhotonの組み合わせ • PhotonへのP2P情報 • 各プレイヤーへカスタムプロパティ追加 • 通信先のIPv4アドレス・ポート • ルームマッチング後に、プレイヤーのアドレスを使用して、P2P通信できるか チェック • PC環境では、80%~90%のゲームユーザーはP2Pで通信できる • 1サーバー3000-4000インスタンス
  47. 47. サーバー構成
  48. 48. サーバー構成 マスターサーバー LoadBalancing バックアップ マスターサーバー LoadBalancing ゲーム クライアント STUNサーバー カスタム認証 サーバー PHP ゲームサーバー LoadBalancing ゲームサーバー LoadBalancing ゲームサーバー LoadBalancing AWS(Amazon Web Services) EC2を使用
  49. 49. サーバー構成 • AWS3リージョン • 東京 • バージニア(北米) • フランクフルト(ドイツ)
  50. 50. まとめ
  51. 51. まとめ • Photonの完成度が高い • C++のバージョンも問題なく使用できる • 組み込み実装コストが少ない • 不具合などもなかった • FF15の場合、必要な機能はそろっていたので サーバーをカスタマイズせずにそのまま使用できた • 通信量の対策は必要 • コンソールのマルチプレイは通信する量が多い • 現時点では、工夫が必要になる
  52. 52. Photon Server 利用初期によくあるお問い合わせ
  53. 53. 内容: PhotonServerをコマンドで立ち上げることは可能? 回答: PhotonSocketServer.exeを利用して、Photon Serverの アプリケーションを起動できます 一例: PhotonSocketServer.exe /install <PhotonServiceName> sc start "Photon Socket Server: <PhotonServiceName>“ *サービスとして実行する場合、上記が記載してあるbatファイルを作成 よくあるお問い合わせ01 参考:https://doc.photonengine.com/ja-jp/onpremise/current/reference/command-line-manual
  54. 54. 内容:無償or有償ライセンス どちらが適用されているか不明 回答:PhotonCLR.logをチェックしてみましょう ファイル名: (server_sdk) deploybin_Win64logPhotonCLR.log ログ内容: INFO PhotonHostRuntime.PhotonLicensing - LICENSE: Type:Standard; Plan:monthly; Expiration: never; floating license: yes; max connections: 500; valid IPs: any; status:Licensed *500CCU月額契約ライセンスの例です。 よくあるお問い合わせ02
  55. 55. ライセンス種によるログ出力内容の違い • 100CCU無償ライセンス INFO PhotonHostRuntime.PhotonLicensing - LICENSE: Type:Standard; Plan:Free; Expiration: never; floating license: yes; max connections: 100; valid IPs: any; status:Licensed • CCU数無制限30日間無償ライセンス INFO PhotonHostRuntime.PhotonLicensing - LICENSE: Type:Standard; Plan:Trial; Expiration: 2018/06/22; floating license: yes; max connections: Unlimited; valid IPs: any; status:EvaluationMode • 500CCU月額契約ライセンス INFO PhotonHostRuntime.PhotonLicensing - LICENSE: Type:Standard; Plan:monthly; Expiration: never; floating license: yes; max connections: 500; valid IPs: any; status:Licensed • CCU数無制限月額契約ライセンス INFO PhotonHostRuntime.PhotonLicensing - LICENSE: Type:Standard; Plan:monthly; Expiration: never; floating license: yes; max connections: Unlimited; valid IPs: any; status:Licensed • 60ヶ月間有効買い切りライセンス INFO PhotonHostRuntime.PhotonLicensing - LICENSE: Type:Standard; Plan:onetime; Expiration: never; floating license: yes; max connections: Unlimited; valid IPs: any; status:Licensed • いずれのライセンスファイルもあたっていない場合 INFO PhotonHostRuntime.PhotonLicensing - LICENSE: No license file was found - starting with Bootstrap License.
  56. 56. 参考:ライセンス種類チェックは他の方法も ライセンスファイル名(デフォルト)の確認 100CCU無償ライセンス [アカウントメールアドレス].Photon-vX.free.100-ccu.license CCU数無制限30日間無償ライセンス [アカウントメールアドレス].Photon-vX.trial.unlimited-ccu.license 500CCU月額契約ライセンス [アカウントメールアドレス].Photon-vX.SxM.500-ccu.[APPID].license CCU数無制限月額契約ライセンス [アカウントメールアドレス].Photon-vX.SxM.unlimited-ccu.[APPID].license 60ヶ月間有効買い切りライセンス [アカウントメールアドレス].Photon-v4.unlimited-ccu.[APPID].license 注意:PhotonServerでは、 ライセンスファイル名を変更 しても利用できるため、 管理上ファイル名変更済のライ センスだと参考になりません。 ライセンスファイルは PhotonSocketServer.exeと同じ フォルダ階層に格納します
  57. 57. よくあるお問い合わせ03 内容: Photon Serverのプロセスがダウンしたので調査してほしい 回答: 調査を行う上で、ログや環境情報の提出をお願いしています 【ログ】 Photon Serverで取得 PhotonCLR.log Application.log PhotonSocketServer.log クライアント側のDebugログ パフォーマンス系のログ など 【環境情報等】 PhotonServerのSDKバージョン (server_sdk)deploybin_Win64version.txt WindowsServerのバージョン クライアントSDKの情報 事象発生時間(JST、UTC) Pluginの利用可否 など
  58. 58. 調査依頼時のログ取得について Debugレベルでのログ取得をお願いします 例:PhotonCLR.log 参考:https://doc.photonengine.com/ja-jp/onpremise/current/app-framework/logging 変更対象ファイル: (sever-sdk)deploybin_Win64Photon.local.log4net 37行目 ==変更前(抜粋)== <!-- logger --> <root> <level value=“INFO” /> <appender-ref ref=“A1” /> <!-- appender-ref ref=“ConsoleAppender” / --> </root> ==変更後(抜粋)== <!-- logger --> <root> <level value=“DEBUG” /> <appender-ref ref=“A1” /> <!-- appender-ref ref=“ConsoleAppender” / --> </root> より詳細な調査が行えます
  59. 59. Photon運営事務局では日々サービス提供元と連携しながら お客様をサポートさせていただいております!
  60. 60. お知らせ
  61. 61. リアルタイム対戦アクションゲーム開発 における新しいアプローチ QUANTUM Photon Quantumとは • 予測性を持つネットワークエンジン • こんなゲームで相性抜群: MOBA、RTS、スポーツゲーム、格闘ゲーム、スクロール ACT Quantumデモ Photonブースにて初公開! Photon Quantumの詳細はコチラ: https://www.slideshare.net/UnityTechnologiesJapan002/unite-tokyo-20183d-photon
  62. 62. まとめ Photonなら速やかにマルチプレイを実装いただけます! – デフォルト機能が豊富/カスタマイズにも対応! お問い合わせはコチラまで! WebSite: photonengine.com Mail: developer@photonengine.jp
  63. 63. ThankYou!!

×