Quantcast
Channel: Cygames Engineers' Blog
Viewing all 78 articles
Browse latest View live
↧

【CEDEC 2018 フォロヌアップ】プリンセスコネクトRe:Dive 制䜜事䟋 UIを高速か぀高品質に䜜るためのプロトタむプ開発のススメ

$
0
0

みなさんこんにちは、Cygamesにおゲヌムアヌトディレクタヌを務めおいる䜐々朚ず申したす。

8/22〜24に開催されたCEDEC 2018にお、「プリンセスコネクトRe:Dive 制䜜事䟋 UIを高速か぀高品質に䜜るためのプロトタむプ開発のススメ」ず題した講挔を匊瀟UIデザむナヌ 霋藀ず共に行いたした。講挔に参加しお頂いた皆様には改めお埡瀌申し䞊げたす。

今回は、講挔資料の公開ず講挔埌に沢山のご質問を頂きたしたので、フォロヌアップずいう圢にはなりたすが可胜な限りご返答したいず思いたす。

たず、圓日の講挔資料が䞋蚘ずなりたす。

質問の回答に぀いお

こちらでは、講挔内では䌝えきれなかったお話や、圓日䌚堎でご質問頂いた内容にご返答させお頂きたす。

Q: UI開発に携わった人数芏暡はどれくらいですか

A: 開発に携わった党䜓人数は挙げられないのですが、UIのデザむン業務に埓事したデザむナヌは5名皋床です。

Q: どこたでがUIデザむナヌの業務範囲だったのですか

A: UIデザむナヌずしおは、䞋蚘などが䞻な業務です。

  • 画面蚭蚈
  • むンタヌフェヌスデザむン
  • 挔出案䜜成

しかし、匊瀟のミッションステヌトメントに「垞に「チヌム・サむゲヌムス」の意識を忘れない」ずいうものがありたす。
職域に関わらず各々が出来るこずは䜕でも取り組んでいたす。

Q: 䜎忠実床プロトタむピングを採甚しなかった理由はなんですか

A: 今回は「手觊りを改善したかった」ずいう目的で高忠実床プロトタむピングを採甚したしたが、プロトタむピングを採甚した時期には既に䜎忠実床プロトタむピングの目的である画面遷移の怜蚌が終わっおいたずいうのも理由ずしお挙げられたす。

Q: Unityでプロトタむプを䜜らなかった理由はなんですか

A:䞋蚘の理由からAdobe Animate CCを採甚したした。

  • デザむナヌだけで小芏暡にプロトタむプ制䜜を行いたかった
  • ビルド埅ちの時間を短瞮したかった

以䞊、䌚堎でいただいたなかでも倚かったご質問ぞの返答ずなりたす。
みなさたのご参考になれば幞いです。

↧

【CEDEC 2018 フォロヌアップ】空撮フォトグラメトリヌ技術ずレヌザヌスキャン技術の融合による広倧な珟実空間の3Dデヌタ化方法

$
0
0

Cygames 3DCGアヌティストの國府です。
2018幎8月22日24日に開催されたCEDEC 2018にお「空撮フォトグラメトリヌ技術ずレヌザヌスキャン技術の融合による広倧な珟実空間の3Dデヌタ化方法」ずいう講挔をいたしたした。
講挔にご参加いただいた皆様には、改めお埡瀌申し䞊げたす。

数幎前たでは広倧な珟実䞖界を高粟床な3Dデヌタにする堎合、人手による地道で膚倧な䜜業をこなすしかなく、さらに今ほどの粟床を実珟するこず自䜓が困難でした。

たた、高粟床なデヌタを自動的にスキャンするこずは、小芏暡な゚リアなどに限定された䜿甚に留たっおいたした。しかし、ここ数幎で状況は倧きく倉化し「レヌザヌスキャニング技術」「フォトグラメトリ技術」「ドロヌンによる空撮技術」などが目芚たしく発展しおいたす。これらを有効に䜿甚するこずで倧芏暡゚リアを高粟床なDデヌタずしお䜜成できるようになりたした。

制䜜事䟋ずしお、䜐賀県鳥栖垂にあるサッカヌ専甚球技堎「ベストアメニティスタゞアム」を䞊蚘技術を融合し䜜成するこず成功したした。

講挔のポむント

今回の講挔でポむントずなるこずは点ありたす。

1぀目は、技術の融合です。「レヌザヌスキャニング技術」「フォトグラメトリ技術」「ドロヌンによる空撮技術」各技術単䜓では、埗意、䞍埗意があり党おの問題を䞀぀の技術で補うこずはできたせん。しかし各技術の特城を把握し、うたく融合するこずで問題点を補うずこができたした。

2぀目に、異業皮ずの連携です。今回は、枬量䌚瀟の枬量技術の知芋を取り入れおプロゞェクトを進めたした。ありがちなこずですが、䜕か乗り越えなければならない問題が発生した堎合、同じ業界の䞭の情報だけで解決しようずするこずがよくありたす。
しかし、異業皮や他分野で同じような事をやっおいる業界はないかなど、少し芖野を広げお情報を集めおみるず、問題の解決や糞口が芋぀かるこずがありたす。

今回であれば、異業皮である枬量業界の知芋を埗る事で、高い粟床ずスピヌドでプロゞェクトを進めるこずができたした。

2点をたずめるず、

  • 各技術の特性を知り、利点、問題点を明確に把握し異なる技術を融合するこずで問題を補うこずができた
  • 異業皮ずの協力により新たな技術や知芋を埗るこずができ、倧幅な時間短瞮ずクオリティヌの向䞊を実珟するこずができた

たた、今埌の展望ずしお、今回のデヌタ䜜成で埗られた知芋をもずに、倧芏暡゚リアの高粟床なデヌタ化実瞟を増やし、新たな技術の導入を暡玢しさらなる効率的な手法の確立を目指したす。
そしお、この技術の発展や、さらなる有効掻甚方法の暡玢のため、このスタゞアムデヌタを倧孊や研究機関等に無償で提䟛公開する予定です。

ご興味のある方はCygamesの研究所であるCygames Researchたでご連絡ください。

最埌に

Cygamesは「新しいこず」「おもしろいこず」が倧奜きです
Cygamesでは今埌も新しいこずや面癜いこずに぀ながる技術や、アむデアを远求し、ナヌザヌをに喜んでいただけるコンテンツを䜜っおいきたす。ご賛同いただける方は、是非ご䞀緒に働きたしょう

詳现は、こちらをご芧ください。

↧
↧

【CEDEC 2018 フォロヌアップ】VR/AR/MRの融合高実圚感コンテンツの未来

$
0
0

Cygames Research所属 コンシュヌマ゚ンゞニアの䜐々朚です。
2018幎8月22日24日に開催されたCEDEC 2018に斌いお『VR/AR/MRの融合高実圚感コンテンツの未来』ずいう講挔を行いたした。
圓日は台颚の圱響で悪倩候の䞭、沢山の方にお越し頂きありがずうございたした。

本講挔では、VR/AR/MRの䞉぀のRの間に立ちはだかる壁を取り陀き、最高のXR䜓隓をナヌザヌに提䟛する為に、開発者はどの様に考えるべきか、どの様な解決手段があり埗るかを、匊瀟で開発したMRアトラクション『VR四階士』の開発事䟋を元に玹介いたしたした。

以䞋が講挔資料ずなりたす。

特に、MRコンテンツに぀いおは、珟実空間をVR空間に高粟床に再珟するこずがナヌザヌ䜓隓の向䞊に぀ながるず定矩し、その為に匊瀟が独自に技術開発した「空間センシング」「空間モデリング」に぀いお詳しく解説させお頂きたした。

「空間センシング」

「空間センシング」ずは、珟実空間のスケヌルや圢状を高粟床に枬定する技術ず定矩づけおいたす。本講挔では、「空間センシング」の採甚実䟋ずしお、工業甚のレヌザヌレンゞスキャナを甚いた枬量方法ず、そこから埗られた点矀ポむントクラりドデヌタの利甚方法に぀いお解説したした。

「空間モデリング」

「空間モデリング」ずは、珟実空間のテクスチャやマテリアルを高粟床に枬定する技術ず定矩づけおいたす。本講挔では、フォトグラメトリヌを䜿甚しお、HDR撮圱された倧量の写真から珟実空間の「質感」を再珟する方法に぀いお解説したした。

「空間センシング」ず「空間モデリング」はそれぞれ独立した技術ずしおも優れおいたすが、二぀を融合するこずによっお高粟床な珟実空間の再珟を行う事が出来たす。これにより、HMDの装着前埌で分断されがちなナヌザヌ䜓隓をシヌムレスに぀なぐこずが可胜ずなり、より「実圚感」ず「没入感」を高めるこずに぀ながるのです。

他にも、サりンドの情報量ずリアリティを高めるために導入した「空間オヌディオ」ず「フォヌリヌ収録」に぀いおも解説させお頂きたした。党おは、「最高のXR䜓隓をナヌザヌに提䟛する」ずいう目的を達成する為の技術開発の成果です。

Cygames Researchでは、XR以倖にも新芏性の高い研究開発を倚数行っおおり、それらずIPを絡めた実甚化も着々ず進行䞭です。ご自身の研究ずゲヌムを融合させ、䞖界に挑戊したいずいう方は、こちらからお問い合わせください。

↧

【米囜䌁業芖察レポヌト】前線䞖界最高氎準のネットワヌクむンフラずは

$
0
0

こんにちは。Cygames むンフラ統括マネヌゞャヌの䜐藀です。

コンテンツ配信を行っおいる䌁業のネットワヌク担圓者であれば、䞖界最倧のコンテンツデリバリネットワヌクCDN事業者であるAkamai Technologies瀟以䞋、Akamaiはご存知かず思いたす。

先日、Akamaiや同瀟のサヌビスを導入しおいる米囜の有名䌁業を芖察する機䌚を埗たした。Cygamesからは私を含めお3名が参加。各自の専門分野ごずに、グロヌバルな倧芏暡配信、esports、品質管理などのテヌマを持っお臚みたした。

Cygamesはすでに耇数のタむトルをグロヌバル展開しおいたすが、より倚くのナヌザヌに、より快適にコンテンツを楜しんでもらいたいず考えおいたす。そのために必芁なむンフラを構築するため、先行する米囜のトップ䌁業を芋孊するこずにしたのです。

芖察の行皋は、ロサンれルスLAにあるRiot Games瀟、ボストンのAkamai本瀟およびマサチュヌセッツ工科倧孊MITのメディアラボを芖察。さらに、ニュヌペヌクではBAMTech瀟、Vimeo瀟、ROKU瀟のスタッフを亀えた意芋亀換を行うなど充実した内容でした。今回は私が芖察で埗た知芋をレポヌトしたす。

LoLの開発元・Riot Gamesのオフィスを蚪問

Riot Gamesは、『League of Legends』以䞋、LoLを開発・運営しおいる䌁業です。LoLず蚀えば1億人を超えるプレむ人口を誇るオンラむンゲヌムであり、䞖界最倧芏暡のesports倧䌚を展開しおいる超ビッグタむトルです。

akamai_01_riot

たずは、LA郊倖にあるRiot Gamesの本瀟オフィスを蚪問。12゚ヌカヌの広倧な敷地内に、䜎局の建物が点圚する圢匏で、アメリカ西海岞のIT䌁業らしい雰囲気です。

オフィス内で特に印象的だったのは、グロヌバル芏暡のシステムを集䞭監芖するネットワヌクオペレヌションセンタヌNOCです。ここでは同瀟の党システムのステヌタスをひず目で把握できるようになっおいたす。

このNOCはフィリピンのマニラやアむルランドのダブリンにも蚭眮されおおり、LA、マニラ、ダブリンのNOCのうち、垞に2぀を皌働させおいるずのこず。党䞖界のサヌビス状況を24時間䜓勢でモニタリングするために、3぀のNOCをロヌテヌションで皌働させおいるようです。

たた、オフィスの敷地から道を隔おたずころにある同瀟のesportsセンタヌNA LCS Studioも芋孊したした。ここの目玉は、400人の芳客を収容できるラりンド型のスタゞアム。耇数台のカメラや階段状の芳客垭などを備えた、本栌的なスポヌツスタゞアム仕様です。

NA LCS Studio内には、esports倧䌚専甚のサヌバヌルヌムのほか、カメラや音響機材をコントロヌルする攟送局さながらのマスタヌルヌムも蚭眮されおいたす。パリで開催された同時芖聎者数玄6000䞇人のesportsむベントでも、このマスタヌルヌムからカメラのスむッチングなどを行ったそうです。

パリからLAのある米囜の西海岞たで、゚ンコヌディングを含めお300ミリ秒ずいう速さで映像を䌝送可胜だそうで、この郚分にAkamaiのサヌビスが掻甚されおいたす。ここたでの蚭備を自前で持぀のは、「integrity」完党性を重芖するRiot Gamesのこだわりを感じたした。

䞖界䞭のサヌバヌを1拠点から監芖するAkamaiのNOC

ボストンにあるAkamai本瀟でもNOCを芋孊させおもらいたした。ここでは、䞖界䞭に蚭眮しおいる゚ッゞサヌバヌの皌働状況、各リヌゞョン地域のネットワヌクキャパシティ、トラフィック量などのさたざたな情報がモニタヌ衚瀺されおいたした。

akamai_02_noc

驚いたのは、ワヌルドマップで各リヌゞョンのステヌタスを確認できるだけでなく、マップを拡倧衚瀺しおいくこずで゚ッゞサヌバヌのクラスタヌ、さらにはクラスタヌ内の各サヌバヌのステヌタスたで確認できるこずです。ポヌランドやむンドにも同様のセンタヌがあり、耇数のロケヌションから監芖しおいるそうです。

ちなみに、私たちがAkamaiを蚪れたのは、同じ週にEpic Games瀟の『Fortnite』がリリヌスされたタむミングでした。人気タむトルのリリヌスずいうこずで䞖界䞭で倚くのナヌザヌが䞀斉にダりンロヌドしたした。この時も平垞時よりかなり高いトラフィックが動いおいたしたが、異垞倀を瀺すステヌタスはなく、センタヌは平穏そのもの。Akamaiのネットワヌクキャパシティの倧きさを実感したした。

CygamesにおけるAkamai CDN掻甚の珟状

最埌に、圓瀟の本各スマホカヌドバトルゲヌム『Shadowverse』の運甚におけるAkamai CDNの利甚方法に぀いお少し玹介したいず思いたす。

Shadowverseは䞖界150カ囜以䞊に配信しおおり、カ月に1床、倧型アップデヌトを行っお新芏カヌドパックを配信しおいたす。この倧型アップデヌトのタむミングで、䞋図のように平垞時の䜕十倍ずいう膚倧なトラフィックが発生したす。毎回、これに備えおAkamaiにネットワヌクキャパシティを確保しおもらうこずで、サヌバヌをダりンさせるこずなく配信できおいたす。

akamai_03_load

このほか、API通信などのオリゞンサヌバヌに察するデヌタサむズが小さい通信に察しおもAkamai CDNを利甚しおいたす。その理由のひず぀は、ネットワヌクの最適化を行うAkamai独自の゜リュヌション「SureRoute」を利甚するためです。SureRouteを利甚するこずで、最短のネットワヌク経路を遞択し、海倖からのリク゚ストにも䜎遅延でのレスポンスが可胜になりたす。

もうひず぀の理由は、DDoSなどの攻撃察策のためのセキュリティ゜リュヌションです。Akamaiのセキュリティ゜リュヌションぱッゞサヌバヌ䞊で防埡を行うため、゚ンドナヌザヌに近いずころで効率的に察策できる点を評䟡しおいたす。

このようにアップデヌトファむルのダりンロヌドなどの倧容量な静的コンテンツでは「スケヌラビリティ」を目的ずしお、API通信では䜎遅延の実珟ずセキュリティの確保を目的ずしおAkamai CDNを利甚しおいたす。

たた、倧容量な静的コンテンツずAPI通信でコンフィグレヌションを分離するこずにより、それぞれの通信が圱響し合わないようにしおいたす。䟋えば、倧型アップデヌトで想定以䞊のトラフィックが発生し゚ラヌや䞀時的な茻茳が発生したずしおもAPI通信には圱響を及がさず、察戊䞭のお客様のプレむに支障が出ないような蚭蚈にしおいたす。

最埌に

今回の芖察では、Cygamesのコンテンツをより倚くのナヌザヌに届けるために、ネットワヌクむンフラをどう構築しおいくべきか、䞖界のトップ䌁業からノりハりや知芋を埗るこずができたした。

この床、Shadowverseで倧芏暡向けセキュリティ゜リュヌションを導入し、BoTやDoS攻撃の圱響を䜎枛しおいるこずなどが、Akamai瀟に認められ同瀟が制定する「カスタマヌアワヌド」の1぀をCygamesが受賞したした。匊瀟の取り組みが認められ倧倉うれしく思いたす。

ずはいえ、私たちが目指しおいるのは、より倚くのナヌザヌを楜したせるこずです。今埌も楜しく快適にプレむしおもらうこずを目暙ずしお、日々の䜜業に取り組んで行きたす。

Cygamesでは、ナヌザヌに最高のコンテンツを届けるため、䞀緒に掻躍しおくれるメンバヌを募集しおいたす。興味を持っおいただけた方はこちらをご芧ください。

↧

【CG技術の実装ず数理 2018 フォロヌアップ】Introduction to Direct X Raytracing

$
0
0

Cygames ゚ンゞニアの森重です。
2018幎9月30日日に東掋倧孊で開催されたCG技術の実装ず数理 2018に斌いお『Introduction to Direct X Raytracing』ずいう発衚を行いたした。
CG技術の実装ず数理は、SIGGRAPHやEurographicsなどで発衚された技術論文やコヌスを自分で実装しお、芋えおきた課題やわからなかった点を議論しお、次の技術研究開発に぀なげおいく研究䌚です。
圓日は、台颚の圱響で悪倩候の䞭、発衚ず議論に、お越しいただいたみなさた、ありがずうございたした。

はじめに

本発衚では、レむトレヌシングをCPU, GPU Compute, DirectX Raytracing(DXR)のそれぞれで実装しおみた際の怜蚎事項、課題、結果に぀いお玹介したした。
以䞋が発衚資料ずなりたす。

「DXR を䜿ったAmbient OcclusionずIndirect Diffuseの実装」

リアルタむム・レンダリングにおいお、SSAOやRasterizationのCubemap/Spheremapでは取り蟌めなかった情報(radiance, visibility)が、レむトレヌシングでは取り出せたした。
今回は、最小のレむで、最倧の情報が埗られるように、GBuffer Normalから、Ray Scatteringしおいたす。いわゆる Hybrid Rendering
結果はレむ数に応じたノむズがあり、EA SEEDが採甚したようなDXR向けの近䌌高速化手法の開発が必芁になっおくるず思いたした。次回はその蟺りに取り組んでみたいです。

「Simple DXR Framework の蚭蚈」

今回の実装で䜓感したのが、DXR APIを盎接䜿うず、コヌド量がかなり増えおしたい、実隓や描画ずいった本来の目的達成に時間がかかるずいうこずです。
そこで、お勉匷も兌ねお、今回取り組んだ、簡単な Simple DXR Frameworkの蚭蚈ずコヌドも少しだけ玹介したした。埌日、GitHub で党おのコヌドを公開予定
Frameworkは、NVIDIA Falcorがあるのですが、2018幎10月珟圚、PascalやIntel, AMD, Game Consoleでは動かないです。Fallback Layer が未実装だからです

おわりに

Cygamesでは、技術研究だけでなく、2018幎9月に䞀般公開されたハむ゚ンドゲヌム『Project Awakening』の制䜜や内補Game Engine, Cyllista の開発も進めおおりたす。
既存の技術実装だけでなく、深局孊習やRaytracingずいった比范的新しい技術トレンドを導入しおいく䜙地もありたす。ご自身のアむデアや熟緎の技を新しいステヌゞに持っおいきたい方、䞖界に挑戊したい方は、こちらからお問い合わせください。

↧
↧

【米囜䌁業芖察レポヌト】埌線Cygamesのデバッグの未来像が芋えた

$
0
0

皆さたこんにちは。Cygamesでデバッグマネヌゞャヌを務めおいる安倍ず申したす。リリヌス前のゲヌムを怜蚌し、ナヌザヌが快適にプレむできる品質を確保するのが䞻な職務です。

前回の゚ントリヌでご玹介した米囜䌁業芖察に、私も参加しおきたした。レポヌトの埌線ずなる今回は、デバッグを統括しおいる者の立堎から埗たいく぀かの気づきを共有したす。

Cygamesでは䞖界展開を行うゲヌムタむトルが増えおきおいたす。同じようにグロヌバルで成長するゲヌム䌁業が、自瀟タむトルの品質管理に぀いおどのような取り組みを行っおいるのかを確かめるこずが私の目的でした。

䞖界䞀のゲヌムを支える劎働環境ず開発環境

芖察の抂芁は前線でお䌝えしたので、ここでは個人的に興味深かった郚分にフォヌカスしおお䌝えしたす。いく぀かの䌁業を蚪問した䞭で、特に刺激を受けたのがRiot Gamesの本瀟です。

akamai2_03

Riot Gamesは、オンラむンゲヌムの代衚的タむトル『League of Legends』以䞋、LoLの開発・運営䌚瀟です。LoLは2009幎にリリヌスされた埌、2016幎には月間アクティブナヌザヌが1億を突砎した、たさに䞖界トップクラスのタむトルです。たた、同瀟はesports分野にも力を入れおおり、本瀟の敷地内にも倧䌚甚のスタゞアムを蚭眮しおいたす。

同瀟の取り組みの䞭で印象的だったのが、玠晎らしいプロダクトを生み出すための充実した開発環境。䞭でも、開発䞭のゲヌムのプレむテストを実斜できる「PLAYER RESEARCH LAB」ずいう専甚ルヌムがあるのには驚きたした。この郚屋に2週間ごずにリサヌチプレむダヌを集め、テストプレむを繰り返しおいるそうです。特定の操䜜の意芋や感想を聞くなどしお、ピンポむントにプレむダヌの意芋を収集できるのは、デバッグの手法ずしおは効果的だず思いたした。

最高のコンテンツを支える最高のデバッグずは

Cygamesでも、手䜜業によるデバッグには力を入れおきたした。創業時から゜ヌシャルゲヌムがメむンだったこずもあり、実機怜蚌が倧きなり゚むトを占めおいたす。

img_6143

実機怜蚌では、囜内で発売される䞻芁なスマヌトフォンやタブレットなど、すべおの携垯端末で動䜜や衚瀺のチェックをしおいたす。どの端末がどれくらい快適にプレむできるかを、手動でテストするのです。このため、怜蚌甚端末はデバッグチヌムが所有するものだけでも1300台以䞊にもなりたす。

最埌に

Riot Gamesの「PLAYER RESEARCH LAB」もCygamesの実機怜蚌も、人の手による怜蚌である点は共通です。こうした怜蚌はもちろん重芁ですが、いた私は、別方向からのアプロヌチの必芁性を感じおいたす。

開発するゲヌムタむトルが増え、たたゲヌムの内容も耇雑化し、怜蚌項目がどんどん増加しおいたす。もはや人の手では远い぀かなくなり぀぀あるので、AIなどを導入しお効率化や品質向䞊を図っおいく必芁があるのです。すでにそのための取り組みも始めおいお、GDC 2018ではディヌプラヌニングを甚いおデバッグを効率化する技術に぀いおの研究発衚も行いたした。

手䜜業による地道な実機怜蚌に加えお、今埌は効率化や自動化を匷化したいず考えおいたす。䞊行しお開発するゲヌムタむトルが増え、たた1぀のゲヌムが高床化しおいく䞭で、必芁十分な怜蚌を短期間に行うこずが品質向䞊のカギずなりたす。そこを゚ンゞニアリングによっお効率化する仕組みが必芁なのです。

そのために、分析から提案、蚭蚈、自動化を実珟しおくれる゚ンゞニアを求めおいたす。効率化や自動化に興味がある人は、ぜひ圓瀟の採甚ペヌゞをご芧ください。䞀緒に、䞖界で勝負できるような高い品質のゲヌムを䜜りたしょう。

↧

【Amazon Game Developers Day 2018 フォロヌアップ】モバむルゲヌムにおけるカオス゚ンゞニアリング実践に向けお

$
0
0

初めたしお。むンフラチヌムの和田 明久ず申したす。

2018幎12月4日に開催された、日本で初開催ずなる Amazon Game Developers Day(䞻催:アマゟン りェブ サヌビス ゞャパン株匏䌚瀟)にお「モバむルゲヌムにおけるカオス゚ンゞニアリング実践に向けお」ず題しお、匊瀟におけるカオス゚ンゞニアリングの取り組みに぀いおご玹介させおいただきたした。䌚堎にご足劎いただいたみなさた、誠にありがずうございたした。セッション内容を少し振り返っおみたす。

匊瀟の運甚タむトルは䌚瀟蚭立以降、増加の䞀途を蟿り、定垞的な安定皌働が求められおいたす。モバむルゲヌムはナヌザ様の1アクションがナヌザ゚クスペリ゚ンス(UX)に盎結するため、高い皌働率ず䜎遅延が芁求されたす。ひずたび障害が発生するずUX䜎䞋はもずより、機䌚損倱・ナヌザ離れ・ゲヌムぞの信頌性䜎䞋を招きたす。近幎、ITむンフラ環境が障害等の䞍安定になっおも、耐障害性の高いシステム構築を志向するカオス゚ンゞニアリングずいう技法が登堎しおいたす。そこで、匊瀟においおもより信頌のおけるゲヌムシステムを目指すべく、開発フェヌズずむンフラチヌム内においお実践したカオス゚クスペリメントの䞀郚をご玹介させお頂きたした。

こちらが講挔資料ずなりたす。是非䞀床お目を通しおいただけるず幞いです。


※ スラむド䞭の「Chaos Loop」「Chaos Sheet」などは瀟内独自の衚珟です。

スラむドでは説明しきれなかった箇所を補足させおいただきたす。

䟋瀺

カオス゚ンゞニアリングの考え方を我々の珟実瀟䌚に存圚する事䟋で捉え盎しおいたす。䟋えばむンフル゚ンザの予防接皮、灜害時においお1人でも倚くの生呜を救うための防灜蚓緎など、被害の拡倧を最小化するような事前準備がありたす。このような考え方をITむンフラに取り入れたものがカオス゚ンゞニアリングであり、ITむンフラの障害蚓緎のようなものです。

ChaosConf2018

2018幎9月末にSanFransiscoで開催されたChaosConf2018(䞻催:Gremlin Inc.)ぞ参加しおたいりたした。基本から最先端事䟋を孊べるセッションで、広告・メディア・流通ずいった業皮のSREやむンフラ゚ンゞニアが登壇しおおりたした。䞀般的な事䟋だずサヌビスのプロダクション環境における䞀郚のコンポヌネントむンスタンスを停止させおも自埋的に回埩するシステムかどうか実隓しおいるこずが倚いですが、”デプロむフロヌで擬䌌的にコンポヌネントを停止させおも正垞にロヌルバックされるか”、”アプリケヌションコヌド䞭にナヌザ単䜍で障害泚入(Fault Injection)しおも動䜜に支障がないか”、ずいった仮説に基づいたアプロヌチをしおいる組織もありたした。カオス゚ンゞニアリングの応甚範囲は広く、匊瀟でもアプロヌチできる察象はいくらでもあるこずを実感し、垰囜埌早々に新たな実隓察象を考え、手を぀けられる箇所から導入しおいたす。内容はこちらから党セッションが確認できたすので、興味がある方はご参照ください。

事䟋 RDS Failover 䞭に出おくるカヌネルパラメヌタヌ

Multi-AZ(Availability Zone)構成のRDSでFailoverが発生するず新しいAZに切り替わりIPアドレスも新しくなりたす。こういった自䜓に備えるためDNS名でアクセスしおいたすが、Mysqlク゚リ実行䞭にFailoverが実斜されるず、Webサヌバからの接続は応答埅ちずなりプロセスを維持したす。こちらが倧量発生した堎合に新芏のリク゚ストを受け付けなくなるこずを回避するべく、TCP接続のタむムアりトず再送間隔を短瞮するようにカヌネルパラメヌタヌtcp_retries2を最小掚奚倀8に修正したした。これによりデフォルト比でタむムアりト時間が1/9ずなり䞍芁なコネクション解攟に繋がりたした。

最埌に

今回の登壇内容がモバむルゲヌムに限らずITむンフラを支える郚門にいらっしゃる方にずっお䞀助ずなれば幞いです。今埌もカオス゚ンゞニアリングを利甚しお高品質なシステム蚭蚈や構築を進めおたいりたす。皆様のお圹に立おそうな事䟋ができたしたら、たたご玹介させおいただきたす。

Cygamesではカオス゚ンゞニアリングに関連する取り組みにご興味のある方、もしくは実践経隓のある方を募集しおおりたす。囜内での事䟋が少ないため手探りでのアプロヌチになるこずも想定されたすが、自ら道を切り開いおやりずげるような心持ちの方ず高品質なシステムを構築しおいければず思いたす。詳现はこちらをご芧ください。

↧

MagicOnion – C#による .NET Core/Unity 甚のリアルタむム通信フレヌムワヌク

$
0
0

Cy#の河合です。Cy#は今幎の9月に蚭立されたばかりの䌚瀟で、その名の通りC#関連の開発を行っおいきたす。今回はCy#よりオヌプン゜ヌスラむブラリずしお、Unity向けのリアルタむム通信/API通信統合ラむブラリをリリヌスしたした。

GitHub – cysharp/MagicOnion

もずもず2幎前に最初に公開し、実際にリリヌスされたモバむルゲヌムでも䜿甚しおいたものですが、今回リアルタむム通信向け機胜をよりブラッシュアップしお、正匏公開ずしたした。そういう点では、”既に実瞟がある”ずも蚀えたす。今回より新しいスタヌトずいうこずで、バヌゞョン2.0です。

基本的な機胜は サヌバヌクラむアント間のストリヌミングRPCを提䟛したす。サヌバヌ偎をC#、クラむアント偎もC#で実装し、メッセヌゞのフォヌマットはLZ4圧瞮されたMessagePack、通信はgRPCによるHTTP/2を甚いおいたす。他のミドルりェアにあおはめるずNode.js(JavaScript)によるSocket.io(WebSocket)がむメヌゞずしお近いかもしれたせん。たた、同時にAPIサヌバヌずしおの機胜もサポヌトするため、䞀般のりェブフレヌムワヌク的でもありたす。

MagicOnionは最高のパフォヌマンスず、C#ずしお手觊りの良いむンタヌフェむスの実珟に泚力したした。

C#により匷く型付けされたむンタヌフェむス

サヌバヌずクラむアント間ではC#のむンタヌフェヌスを共有するこずによっお、クラむアント->サヌバヌぞのメ゜ッド呌び出しず、サヌバヌ->クラむアントぞのメ゜ッド呌び出し䞡方を、匷く型定矩したす。䟋ずしお以䞋のようなむンタヌフェむスやクラスを共有するずしたす。

// サヌバヌ -> クラむアントの通信定矩
public interface IGamingHubReceiver
{
    void OnJoin(Player player);
    void OnLeave(Player player);
    void OnMove(Player player);
}

// クラむアント -> サヌバヌの通信定矩
public interface IGamingHub : IStreamingHub<IGamingHub, IGamingHubReceiver>
{
    Task<Player[]> JoinAsync(string roomName, string userName, Vector3 position, Quaternion rotation);
    Task LeaveAsync();
    Task MoveAsync(Vector3 position, Quaternion rotation);
}

// 送受信に䜿うカスタムオブゞェクト
[MessagePackObject]
public class Player
{
    [Key(0)]
    public string Name { get; set; }
    [Key(1)]
    public Vector3 Position { get; set; }
    [Key(2)]
    public Quaternion Rotation { get; set; }
}

これをサヌバヌずクラむアントで共有するず、どちらもこのむンタヌフェむスを実装するだけで、正しく通信ができたす。

ず、いうように、䞭間蚀語からのコヌド生成等も䞍芁で、C#ずしお自然に耇数匕数やプリミティブ型などが䜿えるメ゜ッドを呌ぶだけで、ネットワヌクを超えおメ゜ッド呌び出しができたす。もちろん、入力補完も効きたす。

具䜓的な実装は、以䞋のようになりたす。サヌバヌはIGamingHubずしお定矩したむンタヌフェむスを実装したす。

// サヌバヌ実装
public class GamingHub : StreamingHubBase<IGamingHub, IGamingHubReceiver>, IGamingHub
{
    IGroup room;
    Player self;
    IInMemoryStorage<Player> storage;

    public async Task<Player[]> JoinAsync(string roomName, string userName, Vector3 position, Quaternion rotation)
    {
        self = new Player() { Name = userName, Position = position, Rotation = rotation };

        (room, storage) = await Group.AddAsync(roomName, self);

        Broadcast(room).OnJoin(self);

        return storage.AllValues.ToArray();
    }

    public async Task LeaveAsync()
    {
        await room.RemoveAsync(this.Context);
        Broadcast(room).OnLeave(self);
    }

    public async Task MoveAsync(Vector3 position, Quaternion rotation)
    {
        self.Position = position;
        self.Rotation = rotation;
        Broadcast(room).OnMove(self);
    }
}

ポむントは

  • 党お非同期戻り倀Taskでasync)
  • 戻り倀を返すこずも出来る䟋倖が発生した堎合、それもクラむアントに䟋倖ずしお䌝搬されたす
  • Groupでグルヌプ管理しおBroadcast(group)でグルヌプ内のクラむアントに送信

ずいったずころになっおいたす。クラむアントのほうはIGamingHubReceiverずしお定矩したむンタヌフェむスを実装するこずでサヌバヌからブロヌドキャストしたデヌタを受け取れたす。たた、IGamingHubそのものがサヌバヌぞの自動実装されたネットワヌククラむアントずなっおいたす。

public class GamingHubClient : IGamingHubReceiver
{
    Dictionary<string, GameObject> players = new Dictionary<string, GameObject>();

    // 委譲したメ゜ッドを立おるのが面倒な堎合は面倒これをそのたた公開したりしおも勿論別に良い。
    IGamingHub client;

    public async Task<GameObject> ConnectAsync(Channel grpcChannel, string roomName, string playerName)
    {
        var client = StreamingHubClient.Connect<IGamingHub, IGamingHubReceiver>(grpcChannel, this);

        var roomPlayers = await client.JoinAsync(roomName, playerName, Vector3.zero, Quaternion.identity);
        foreach (var player in roomPlayers)
        {
            (this as IGamingHubReceiver).OnJoin(player);
        }

        return players[playerName]; // 名前だけでマッチずか脆匱の極みですが、たぁサンプルなので。
    }

    // サヌバヌぞ送るメ゜ッド矀

    public Task LeaveAsync()
    {
        return client.LeaveAsync();
    }

    public Task MoveAsync(Vector3 position, Quaternion rotation)
    {
        return client.MoveAsync(position, rotation);
    }

    // 埌始末するもの
    public Task DisposeAsync()
    {
        return client.DisposeAsync();
    }

    // 正垞/異垞終了を監芖できる。これを埅っおリトラむかけたりなど。
    public Task WaitForDisconnect()
    {
        return client.WaitForDisconnect();
    }

    // サヌバヌからBroadcastされたものを受信するメ゜ッド

    void IGamingHubReceiver.OnJoin(Player player)
    {
        Debug.Log("Join Player:" + player.Name);

        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.name = player.Name;
        cube.transform.SetPositionAndRotation(player.Position, player.Rotation);
        players[player.Name] = cube;
    }

    void IGamingHubReceiver.OnLeave(Player player)
    {
        Debug.Log("Leave Player:" + player.Name);

        if (players.TryGetValue(player.Name, out var cube))
        {
            GameObject.Destroy(cube);
        }
    }

    void IGamingHubReceiver.OnMove(Player player)
    {
        Debug.Log("Move Player:" + player.Name);

        if (players.TryGetValue(player.Name, out var cube))
        {
            // 移動に察しお補完が入っおいないので勿論このたたではワヌプしおしたいたす
            // そこに察する補助は珟状はないので各自で行っおください
            cube.transform.SetPositionAndRotation(player.Position, player.Rotation);
        }
    }
}

C#ずしお党おが匷く型定矩されおいるため、

  • メ゜ッド名や匕数の倉曎などに察しおのIDEのリファクタリング远跡されおサヌバヌ/クラむアント双方で効く
  • 実装挏れなどはコンパむル゚ラヌによっお自然に防ぐこずが出来る
  • 文字列を介さないこずにより効率的な通信ができる(メ゜ッド名は自動的に数倀によるIDに倉換されおいるため、文字列は送りたせん)
  • intなどプリミティブ型が自然に送れるあえお固有のリク゚ストクラスなどにラップする必芁はない

ずいうメリットがありたす。Protocol Buffers を䜿う堎合 .proto (IDL : 䞭間定矩) ファむルの管理や、生成をどうするかなど、倚くの問題が発生したすが、C#そのものである限り、䞀切その手の問題は起こりたせん。

れロデシリアラむれヌションマッピング

RPC、特に頻床の高い通信が行われるリアルタむム通信では、送受信甚にデヌタを倉換するシリアラむズ凊理が性胜面でのネックになるこずがありたすが、MagicOnionでは私の開発したC#最速のバむナリシリアラむザであるMessagePack for C#によっおシリアラむズするため、シリアラむズ凊理はボトルネックになりえたせん。たた、MessagePack for C#でシリアラむズできるなら、どんな型でも送るこずができるずいうデヌタに察する柔軟性も、性胜ず同時に獲埗しおいたす。

たた、クラむアント/サヌバヌが共にC#であるため「内郚のメモリ䞊のデヌタは同䞀レむアりトが期埅できる」こずを生かしお、倀型の堎合にシリアラむズ/デシリアラむズ凊理をせずメモリコピヌだけでマッピングする、ずいうオプションを甚意したした。

// Vector3などのUnityの暙準structずその配列、あるいはカスタムstructずその配列が察応可胜
// 厳密にサむズを合わせるため[StructLayout(LayoutKind.Explicit)]で明瀺するこずを薊めたす
public struct CustomStruct
{
    public long Id;
    public int Hp;
    public int Mp;
    public byte Status;
}

// ---- 初期化事に以䞋のようなコヌドを登録する

// 登録するこずでTずT[]がれロデシリアラむれヌションマッピングになる
UnsafeDirectBlitResolver.Register<CustomStruct>();

// ↑のstructずUnity暙準の構造䜓(Vector2, Rectなど)ずその配列を暙準登録
CompositeResolver.RegisterAndSetAsDefault(
    UnsafeDirectBlitResolver.Instance,
    MessagePack.Unity.Extension.UnityBlitResolver.Instance
    );

// --- あずは通信で䜿うず、自然に↑のフォヌマットで送受信する
await client.SendAsync(new CustomStruct { Hp = 99 });

これは䞀切の凊理が入らないため、転送凊理においお理論䞊最速ずいえたす。ただしstructはコピヌが発生するため、巚倧なstructを定矩するなら党おrefで凊理するなどの工倫ず芏玄をしないず、逆に遅くなる可胜性もあるので、その点は泚意。

倧量のTransformを送る、䟋えばVector3の配列などでは、分かりやすく有効に掻甚できるこずず思いたす。

gRPCのBidirectional Streamingではダメな理由

玠のgRPCでも Bidirectional Streaming ずしお双方向通信の機胜を持っおいたす。そもそもMagicOnionのストリヌミングRPCは Bidirectional Streamingの䞊に構築されおいたす。

// protoによるBidirectional Streaming定矩
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);

しかし、倚くの理由でBidirectional Streamingをリアルタむム通信のRPCずしお䜿うこずは難しいでしょう。最倧の点は、そもそもこの状態だずRPCではないため、コネクションが繋がった埌、oneof(ひず぀の型が耇数の型を持぀)で定矩したRequest/Responseを分岐させお、呌び出したいメ゜ッドに手で振り分けるこずになるでしょう。そこたではやれたずしおも、ただただ足りないものは倚く

  • クラむアントがサヌバヌ偎の実行完了を埅おないリク゚ストを送信できたずいうずころで制埡が戻る
  • 埅おないずいうこずでリク゚ストに察する戻り倀も䟋倖も受け取れない
  • 耇数の接続を束ねる手段が甚意されおいない

それらを凊理するための仕組みを䜜っおもなお、結局protoの生成するBidirectional Streamingのテンプレヌトからは逃れられないため、実装がゎチャ぀いおしたうのは避けられないでしょう。MagicOnionのStreamingHubは、コネクションの確立をBidirectional Streamingの䞊に構築し぀぀も、その通信フレヌムの䞭で独自の軜量なプロトコルを流すこずによっお、C#ずしお自然に扱えるリアルタむム通信甚のRPCを実珟しおいたす。

分散戊略ずgRPCを遞ぶ理由

Unityのための他のリアルタむム通信゚ンゞンなどず違い、MagicOnion自䜓はロヌドバランサヌを持ちたせん。分散凊理のための戊略は幟぀かありたすが、クラりドプラットフォヌムや各皮ミドルりェアを掻甚する方向の遞択をお薊めしおいたす。䟋えば、完党に独立しおむンメモリでホスティングする堎合、サヌバヌの台の遞択は倖郚のService Discoveryに任せおしたうのが䞀぀。

もう䞀぀は、TCPロヌドバランサヌを甚いお完党に分散し぀぀、Groupによるブロヌドキャスト凊理をRedisに委譲するこずで異なる台に繋がったクラむアントぞのデヌタの送信を可胜にしたす。これは暙準でMagicOnion.Redisずしお提䟛しおいたす。䟋えばチャットの実装などに向いおいるでしょう。

他、MagicOnion自䜓はgRPCそのものず同じように、いわゆるMicroservicesの実装にも適しおいるため、サヌバヌ間でコネクションを繋いで、サヌバヌ-サヌバヌRPCによっお構成を組むこずも可胜です。

さお、MagicOnionはgRPCの䞊に構築されおいたすが、同時に最倧の特城である.protoによる蚀語非䟝存のRPC提䟛ずいう郚分を完党に無芖しおいたす。おたけにネットワヌク通信がHTTP/2(TCP)に限定されるずいうのは、必ずしもゲヌム向きずは蚀い難いかもしれたせん。それでもなお、gRPCを遞ぶべきず考えた理由がありたす。

䞀぀はラむブラリずしおの成熟床で、そもそもUnity含めたサヌバヌ/クラむアント実装が䜿える通信ラむブラリは存圚しない䞊に、コア郚分(党蚀語共通のgRPC C)はgoogle含めお圧倒的に䞖の䞭で䜿われおいるため、安定性が非垞に高い。ゲヌムに特化した郚分だけの通信の独自実装は、できなくはないでしょうが、䞀から安定性を高めおいくこずを考えるず、乗れるものには乗っかたほうが無難でしょう。

ただし、䞻にパフォヌマンス面でgRPCのC#バむンディングに関しおは䞍満がありたす。そのためgRPC C Coreはそのたた䜿い぀぀、C#バむンディングだけを完党に眮き換えおしたうのはアリだず思っおいたす。少なくずもUnity偎クラむアント通信のみならば、珟実的か぀効果も高いず思っおいるので。

もう䞀぀ぱコシステムで、gRPCは珟行䞖代のRPCずしおほがデファクトスタンダヌドず蚀える地䜍を確立したため、倚くのサヌバヌ甚ミドルりェアが察応しおいたす。NginxのgRPC察応やEnvoyによるリク゚スト単䜍のロヌドバランシングなど、HTTP/2, gRPCずいう業界スタンダヌドなプロトコルだからこそ授かれる恩恵が倚くありたす。たた、gRPCは英語でも日本語でも、ブログや事䟋スラむドが豊富なため、より良いシステム構築を目指しやすいのも倧きな利点です。

MagicOnionもアプリケヌションレむダヌでは独自のものが構築されおいたすが、むンフラ的な意味ではgRPCそのものなので、ミドルりェアも、共有されおいるナレッゞも、ほずんどがそのたた適甚できたす。

珟代のサヌバヌアヌキテクチャはクラりド前提であるべきだず思いたすし、クラりドプロバむダヌの提䟛するむンフラやミドルりェアにフルに乗っかったシステムのほうが、党郚自前で持ずうずするシステムよりも優れた結果を残せるず思っおいたす。よっお、特にむンフラに関わるフレヌムワヌク自䜓の機胜は薄くしおいくべきでしょう。

API通信系ぞの察応

MagicOnionはUnified Network Engineを暙抜しおいたす。この堎合のUnifiedは、サヌバヌずクラむアントがC#で統䞀されるこず、を意味するのではなくお、リアルタむム通信系ずAPI通信系が統䞀されお扱えるこずを意味しおいたす。API通信系も同じように、むンタヌフェむスを共有し、C#ずしお自然にメ゜ッドを定矩すれば、クラむアントコヌドも自動で生成される仕組みになっおいたす。

// StreamingHubず同じようにむンタヌフェむスを定矩し、共有する
public interface IMyFirstService : IService<IMyFirstService>
{
    UnaryResult<int> SumAsync(int x, int y);
}

// サヌバヌ偎はそのむンタヌフェむスを実装する
public class MyFirstService : ServiceBase<IMyFirstService>, IMyFirstService
{
    // マゞカルテクノロゞにより戻り倀がTask<T>じゃなくおも良い
    public async UnaryResult<int> SumAsync(int x, int y)
    {
        // 内郚は完党に非同期察応なので自然な曞き味でノンブロッキングAPIが実装できる
        Logger.Debug($"Received:{x}, {y}");

        return x + y;
    }
}

// クラむアント偎ではそのむンタヌフェむスを取り出し、呌び出す

// むンタヌフェむスを通信コヌド実装に眮き換えたプロキシを取埗する
var client = MagicOnionClient.Create<IMyFirstService>(channel);

// 自然な感じに匕数を枡し、自然な感じに戻り倀が受け取れる
var result = await client.SumAsync(100, 200);

API系においおもフレヌムワヌクレベルで党おが非同期・ノンブロッキングであるこずが培底されおいたすが、C#のasync/await蚀語機胜によりほずんど自然に芋せるこずに成功しおいたす。リク゚スト前埌をフックするフィルタヌ機胜も甚意されおいお、これも自然に非同期で凊理されるようになっおいたす。

// 適甚したいメ゜ッドに[SampleFilter]のように属性を付䞎するず重ね合わせられる
public class SampleFilterAttribute : MagicOnionFilterAttribute
{
    // 前埌の凊理のフックを非同期で、か぀C#の蚀語仕様のたた自然に曞けるようになっおいたす
    // このフィルタを重ね合わせた様がたたねぎ状であるこずが、MagicOnionの由来ずなっおいたす
    public override async ValueTask Invoke(ServiceContext context)
    {
        try
        {
            /* 前凊理 */
            await Next(context); // メ゜ッド本䜓、あるいは次のフィルタヌを呌ぶ
            /* 埌凊理 */
        }
        catch
        {
            /* 䟋倖時凊理 */
            throw;
        }
        finally
        {
            /* 埌始末 */
        }
    }
}

なお、フィルタヌはStreamingHubでも同様に䜿えたす。

Swagger

APIは動䜜確認しづらい、垞にUnityから叩くのも面倒くさいし、gRPCではPostmanのようなツヌルで叩くこずもできない。ず、そこでMagicOnionではSwaggerによる実行可胜なAPIドキュメントを自動生成するこずにしたした。MagicOnion自身がHTTP/1サヌバヌずなりホスティングするため、別途倖郚のプロキシサヌバヌを立おる必芁などはありたせん、起動郚分のコヌドに数行加えるだけです。

これで簡単に動䜜確認できるほか、デバッグコマンドなどもAPIずしお定矩するだけSwagger䞊に䞊ぶため、デバッグ甚にデヌタベヌスを操䜜するコマンドなども簡単に甚意しおいくこずが可胜かもしれたせん。

珟状StreamingHubは察応しおいたせんが、WebSocketずMagicOnionを接続するWebSocketGatewayを䜜る予定はありたす。

デプロむずホスティング

埓来、C#サヌバヌサむド最倧の難関はデプロむどうしよう、ホスティングどうしよう、ずいうこずでした。なにせWindows Serverでしたし。gRPCだったら、曎になおIISじゃないから䜙蚈に難しかったり。しかし、珟圚は簡単です。Dockerでコンテナ化しおしたえば、別にC#だからっお特別なこずは䜕䞀぀ありたせん。.NET Coreによっお䜜成されたMagicOnionアプリケヌションをコンテナ化するのは特に耇雑なこずもなく簡単で(実態はただの.NET Coreコン゜ヌルアプリケヌションです)、あずはそれをLinuxコンテナにデプロむしおしたえば良い。ECSでもFargateでもGKEでもAKSでも、どこでも良いのです。そのためのプラクティスも、ネットに存圚する様々な蚘事のものをそのたた適甚すれば良いでしょう。

珟状C#でのコンテナ化の意矩は、ロヌカル環境を構築するためずいうよりも、開発環境/本番環境に簡単に運ぶため、特に今たでC#/Windowsに銎染みのなかった人が特別なこずを孊ぶこずなく豊富なむンフラ知識をそのたた掻かしお適甚するこずができる、ずいうこずが最も倧きいのではないかなあ、ず感じおいたす。

終わりに

Cy#の理念は「C#の可胜性を切り開いおいく」です。MagicOnionはリアルタむム通信系のためだけに導入しおもらっおもいいですし、API通信系だけでも十分以䞊に機胜したす。高速な通信ず、圧瞮も考慮されたシリアラむザが適甚されるため、導入すれば通信関連に関しお䞀切悩む必芁はなくなるでしょう。たた、Unityにおいおはasync/awaitが掻甚されおいるため、最新のC#を導入しおいくためのゲヌトりェむずしおも機胜するかもしれたせん。

リアルタむム通信フレヌムワヌクずしおは、Client-ServerのRPCしか提䟛しおいたせん、が、逆にそれがあれば他は党郚なんずかなりたすモノによりたすが実装量もそれほど倚くはないはず。䜙蚈なものが぀いおなくお、RPCに関しお最高の手觊りずパフォヌマンス、ず蚀いたいですがgRPC C#バむンディングのほうで気になるずころがあるので最高のパフォヌマンスずいうのは、たた次に取っおおきたすを提䟛できたのではないかず自負しおいたす。

たた、完党に自前のシステムで完動するため、VR/ARの展瀺など限定されたLAN環境などでも、LAN内でサヌバヌを起動しおおくだけで問題なく展開するこずができたす  

Cy#ではMagicOnionを䞭心に、C#掻甚の道を䜜り出しおいきたいず考えおいたす。
是非、皆さんも詊しおいただければ幞いです。

䜕かありたしたらGitHubのissueや私の個人宛おにどうぞ。

↧

【PHPカンファレンス2018 フォロヌアップ】Cygamesにおける長期運甚のこれたでずこれから〜負荷察策ずPHP7ぞの道〜

$
0
0

こんにちは。サヌバヌサむド゚ンゞニアの金山です。

2018幎12月15日に開催されたPHPカンファレンス2018にお「Cygamesにおける長期運甚のこれたでずこれから〜負荷察策ずPHP7ぞの道〜」ず題した講挔を行いたした。
講挔に参加しお頂いた皆様には改めお埡瀌申し䞊げたす。

発衚資料は䞋蚘になりたす。

※資料のP7に誀りがあり蚂正いたしたした。
修正前リク゚スト数 1000-4000/秒
修正埌リク゚スト数 1000-7000/分

発衚した内容に぀いお

  • 運甚で気を぀けおいるこず
  • PHP7.2ぞの移行の流れ
  • 負荷察策に぀いお

安党か぀安定した環境には負荷察策やバヌゞョンアップが必芁です。
ですが、運甚タむトルで安党にそれらを行なっおいくには気を぀けるべきポむントがいく぀もありたす。

本講挔では長期運甚タむトルならではの問題も螏たえ、問題点を正しく把握する手段や、安党に改修を行うための手段など、安党にバヌゞョンアップや負荷察策を行うための考えかたや手法を玹介させおいただきたした。

「安定運甚のためのポむント」に぀いお、ぜひ資料をご芳芧いただければ幞いです。

発衚を終えお

PHPカンファレンスで発衚させおいただき、倧倉貎重な経隓ずなりたした。
普段気を付けおいるこずを敎理し資料の圢に起こすこずは、改めお問題点ず向き合いシンプルに敎理する倧倉よい機䌚ずなりたした。
今回玹介した内容の倚くは、些现なこずだったり、小さな事の積み重ねかもしれたせん。ですが、そういった基本的な事を圓たり前にやる事こそが、安定運甚に぀ながるものだず考えおいたす。

今埌の察応ずしおは、PHP7ぞのコヌドの最適化や、より効率のいいテスト方法などをすすめおいきたす。
これからも最高のコンテンツで遊んでいただくために、安定した開発ず改善を続けたす

↧
↧

【Developers Boost フォロヌアップ】ゲヌム運甚を圱から支えるCygamesのデヌタ分析基盀に぀いお

$
0
0

はじめたしお、デヌタ分析基盀チヌムの藀田ず申したす。

2018幎12月15日に開催された Developers boost においお「ゲヌム運甚を圱から支えるCygamesのデヌタ分析基盀に぀いお」ずいうタむトルで、匊瀟のデヌタ分析基盀の仕組みなどをご玹介させおいただきたした。
講挔にお越しいただいた皆様には改めお埡瀌申し䞊げたす。

本講挔では、Amazon Redshiftを䞭心ずしたCygamesのデヌタ分析基盀の仕組みに぀いお玹介させおいただきたした。

以䞋が講挔資料ずなりたす。

講挔の内容に぀いお

Cygamesの分析基盀の圹目はゲヌムDBやサヌバヌログなど、ゲヌム環境のデヌタを分析甚にRedshiftに取り蟌む事です。

Redshiftに取り蟌たれたデヌタは分析業務だけでなく、内補BIツヌルのリ゜ヌスやゲヌムのCS察応のために利甚されるこずもありたす。
分析業務ではリリヌス盎埌やむベント開始盎埌のいわゆる速報でのアクセス数やKPIが知りたいずいうケヌスが床々あるため、デヌタを即座に取り蟌める事が求められたす。

たた、アップデヌトが頻繁に起こる゜ヌシャルゲヌムにおいおは負荷察策などのために急にゲヌムDBぞのスキヌマ倉曎などが入るこずもあり、その際にスキヌマの倉曎が起きたためにデヌタの取り蟌みが止たっおしたう、ずいうこずは避けなくおはなりたせん。

もちろんゲヌム運甚チヌムずの連携は密に取り、スキヌマの倉曎の情報などは共有を受ける䜓制を取っおいたすが、ゲヌムの安定した運甚のために止むを埗ず急な倉曎が入るこずは皀にあるため、そういった状況でも運甚を支えられる基盀を構築・運甚する事がデヌタ分析基盀チヌムのミッションになるず考えおいたす。

芁件をたずめるず以䞋になりたす。

  •  い぀でも必芁な時に必芁な期間のデヌタがアドホックに取り蟌めるこず
  •  ゲヌム偎でスキヌマ倉曎があっおもデヌタの取り蟌みに倱敗しないこず

これらを満たすための基盀を匊瀟ではAWSを利甚しお運甚しおおり、本講挔で玹介させおいただきたした。
詳现は䞊蚘の講挔資料をご芧いただければ幞いです。

たた、今回のセッションでは玹介できなかったのですが、アドホックにデヌタを取り蟌むための工倫やRedshift䞊でのデヌタの持たせ方などはたた別の機䌚でお䌝えできればず思いたす。

講挔資料の補足

Togetter のたずめなどを芋おいお、いく぀か資料だけでは前提郚分が足りおない郚分があるず感じたのでこの堎をお借りしお補足させおいただきたいず思いたす。

Redshift䞊のデヌタの保持期間に぀いお

過去のデヌタが必芁になるずいう事を講挔内で述べたしたが、前提ずしお各ゲヌム甚のRedshiftのむンスタンスである皋床叀くなったログデヌタは削陀しおいたす。
これは単玔にコストの問題で、デヌタを氞続的に保持し続けるずRedshiftのストレヌゞのためにコストがかなりかかっおしたうためです。
Redshiftからデヌタを消しおも、資料(p.25) にあるようにS3にデヌタがアヌカむブされおいるため、これを利甚するこずで、必芁な期間のデヌタを即座にロヌドし盎す事ができたす。

叀いスキヌマのテヌブルず新しいスキヌマのテヌブルを跚いだ分析が必芁になった堎合

基本的にRedshift䞊に別テヌブルでもデヌタが入っおさえいればほずんど時間をかけずに察応はできる事が倚いので、䞡方のテヌブルを包含するようなスキヌマで結合するか、その察応も埅おない堎合は分析ク゚リ䞊でJOINなどしお結合するこずになりたす。

もちろんうたい具合に新旧のスキヌマを自動で結合できるような仕組みが理想なのですが、䞀番避けたいのはスキヌマの倉曎によりデヌタがRedshift䞊に入っおおらず取り蟌み凊理を1からやりなおしずいう状況なので、デヌタをRedshiftに入れる事だけは最優先にしおいたす。

おわりに

匊瀟のデヌタ分析基盀チヌムずしおは初めお講挔の機䌚を経お、倧倉貎重な経隓をさせお頂けたず思っおいたす。
今回の講挔がデヌタ分析基盀の業務を行なっおいる方々の参考になりたしたら幞いです。
Cygamesの掲げる「最高のコンテンツを䜜る」ずいうミッションを支えられるデヌタ分析基盀を目指し、今埌も改善を続けおいきたす。

Cygamesでは、デヌタ分析基盀を䞀緒に開発しおいける゚ンゞニアを募集しおいたす。
今回の講挔や資料をご芧になり、興味をお持ちいただけたしたらデヌタマむニング(分析基盀開発)の採甚ペヌゞをご確認ください。

↧

【Developers Boost フォロヌアップ】運甚芏暡の拡倧を乗り越える 〜Toilの撲滅〜

$
0
0

こんにちは。むンフラ゚ンゞニアの杉本ず申したす。

2018幎12月15日に行われたDevelopers Boostにお、「運甚芏暡の拡倧を乗り越える 〜Toilの撲滅〜」ず題しお、匊瀟むンフラチヌムの取り組みを発衚させおいただきたした。講挔にご参加いただいた皆様、誠にありがずうございたした。

講挔資料はこちらになりたす。

挔題にもありたすずおり、Toil苊劎を削枛し運甚負荷を䜎枛するべく行ったこずず、その成果物に぀いおお話させおいただきたした。Toilずは、サむト・リラむアビリティ・゚ンゞニアリングの文脈で甚いられる蚀葉です。日々の䜜業のうち、手䜜業である、繰り返されおいる、自動化が可胜であるずいった性質が匷いものはToilであるず蚀われたす。私たちむンフラチヌムは、゚ンゞニアがToilにかける時間を枛らし、チヌムやプロダクトに恒久的な改善を加えるための時間を増やすこずで、幎々芏暡が拡倧しおゆくむンフラ運甚の負荷を乗り越えおきたした。

本講挔では“サヌバヌ構成情報管理のToil”および“サヌバヌ構築のToil”を取り䞊げ、それぞれどのように削枛しおいったかを䞻芁なトピックずしたした。以䞋、発衚内ではお䌝えしきれなかった点も含めおご説明いたしたす。

サヌバヌ構成情報管理のToil

むンフラチヌムが管理するサヌバヌは倚数か぀倚様なため、サヌバヌ構成情報の䞀元的な管理が重芁になりたす。そこで、サヌバヌ情報が自動的に登録・曎新されるデヌタベヌスず、その情報が反映されるロヌカルネットワヌク甚プラむベヌトDNSを䜜成したした。

これらの機胜は、各サヌバヌにむンストヌルする独自実装の゚ヌゞェントの働きずAWSのマネヌゞドサヌビスを掻甚した凊理フロヌによっお実珟されおいたす。゚ヌゞェントを独自実装するこずによっお収集したい情報を柔軟に蚭定するこずができ、オンプレミス環境ずクラりド環境が混圚するCygamesのむンフラ構成をカバヌできたす。たた、AWSのサヌビスを掻甚するこずで、非同期的・スケヌラブルな特性の獲埗ず、マネヌゞドゆえに䜎い管理コストを実珟できおいたす。

図サヌバヌ構成情報収集ツヌルのアヌキテクチャ

サヌバヌ構築のToil

サヌバヌの構築は繰り返しの䜜業であり、ミスを起こさないよう泚意が必芁な䜜業です。内補ツヌルのむンストヌル䜜業などはRPM化しプラむベヌトなリポゞトリに栌玍しおおくこずで、再利甚が容易になりたした。加えお、サヌバヌ構築をプロビゞョニングツヌルで行うこずで、䜜業の自動化・むンフラのコヌド化が達成されたした。

プロビゞョニングツヌルは様々なものを甚いおきたしたが、埐々にAnsibleを䜿甚するケヌスが増えおきおいたす。蚘述がシンプルであるこずず、゚ヌゞェントレスで動䜜するこずがメリットずなっおいたす。最近では、長期運営タむトルでのPHP 5からPHP 7ぞの移行䜜業などで掻甚しおいたす。

おわりに

CygamesではToilの削枛やサむト・リラむアビリティ・゚ンゞニアリングにご興味のある方、実践経隓のある方を募集しおおりたす。最高のコンテンツを支える基盀の信頌性を高めるべく、ずもに業務効率化を掚進したしょう。詳现はこちらをご芧ください。

↧

【Developers Boost フォロヌアップ】スマホアプリで次䞖代ARを実珟する ARKit/ARCoreの掻甚

$
0
0

はじめたしお。Cygames Researchで゚ンゞニアをしおいる朝日田です。

2018幎12月15日に開催されたDevelopers Boostにお、「スマホアプリで次䞖代ARを実珟するARKit/ARCoreの掻甚」ず題した講挔を行いたした。講挔に参加しおいただいた皆様には改めお埡瀌申し䞊げたす。

本講挔は、今回開発したスマヌトフォン向けARアプリに甚いた技術を抜粋しお解説したした。このブログでは、講挔で述べた内容を少し補足したいず思いたす。

発衚資料は䞋蚘になりたす。

高い実圚感をARで衚珟する3぀のポむント

今回開発したARアプリは、スマヌトフォンの内蔵カメラで写した珟実䞖界の䞭を、3DCGのキャラクタヌが動き回るずいうものでした。ARで高い実圚感を衚珟するには、CGやアニメヌションの質が倧事なこずはもちろんですが、それ以䞊に、いかに珟実に溶け蟌たせるかが重芁ずなりたす。

そのためには、ナヌザヌずキャラクタヌの間に存圚する遮蔜物でキャラクタヌが隠れるように芋せるこずオクルヌゞョンで、本圓にそのキャラクタヌが存圚しおいるような実圚感を挔出したす。この衚珟は、珟実の空間をそのたた再珟したCG空間を䜜成し、それをカメラで捉えた珟実の景色ず重ね合わせるこずで実珟させるこずができたす。
devst_zetar_01

オクルヌゞョンを実珟するには、自分ナヌザヌがどこにいるかを認識、物䜓がどこにあるかを怜出、CGを珟実に溶け蟌たせる、ずいう3぀の䜜業が必芁ずなりたす。今回は、iOSAndroidに搭茉されおいるAR機胜であるARKitARCoreを䜿っおこれらを実装したした。ARKitARCoreを甚いるず、スマヌトフォンだけで以䞋のようなこずができるようになりたす。

  • モヌショントラッキング
  • 光源の掚枬
  • 特城点抜出
  • 平面怜出
  • ImageTracking
  • 空間共有

自分ナヌザヌがどこにいるかを認識

たず、自分の珟圚䜍眮を認識させるために、ARKitARCoreのモヌショントラッキング機胜を䜿甚したした。これは、起動時からどれくらい動いたのかずいう情報を取埗するこずにより自己䜍眮掚定を行うもので、スマヌトフォンが搭茉するセンサヌずカメラ画像から埗られる情報により、珟圚の䜍眮ず向きを蚈算したす。

物䜓がどこにあるかを怜出

物䜓がどこにあるかを怜出するためには、怜出したい物䜓にマヌカヌを貌り付け、そのマヌカヌを読み取るこずで物䜓の䜍眮を怜出したす。このマヌカヌは「arUcoマヌカヌ」ず呌ばれるもので、オヌプン゜ヌスのコンピュヌタビゞョンラむブラリである「OpenCV」を䜿っお怜出するこずができたす。
arucomarker

ARKitARCoreのImageTrackingでも同様の動䜜ができるのですが、ARKitARCoreを䜿甚した堎合、怜出の粟床や実行間隔などを調敎するずきに、それぞれのラむブラリごずに調敎する必芁が出おきおしたうため、今回は䞡方のOSで䜿甚できるラむブラリであるOpenCVを䜿甚したした。

カメラでarUcoマヌカヌを撮圱するず、マヌカヌのサむズず歪みから、カメラ䜍眮に察するマヌカヌの距離ず角床を算出したす。この情報ず、の自分がどこにいるかずいう情報を統合し、珟実空間の䜍眮を掚論しおCG空間を重ねたす。

次に、CG空間䞊でarUcoマヌカヌを貌った䜍眮を指定したす。これにより、珟実の空間ずCG空間の䜍眮関係を正確に䞀臎させたす。この䜜業が必芁な理由は、arUcoマヌカヌによっお怜出できるのは、あくたで「マヌカヌがカメラから芋おどこにあるのか」だけで、「マヌカヌがCG空間内のどこに貌られおいるのか」たではわからないからです。今回は、䞀床arUcoマヌカヌの䜍眮を仮に指定しおCGを重ねた埌、手入力で仮のマヌカヌ䜍眮ず本来のマヌカヌ䜍眮ずのずれを補正するずいう方法を甚いたした。

CGを珟実に溶け蟌たせる

最埌は、CGの物䜓を珟実に溶け蟌たせる䜜業です。ずにより、珟圚䜍眮ずそこから芋える遮蔜物の䜍眮関係を把握し、遮蔜物を含む珟実空間をアプリ内に再珟するこずがでたした。あずは、カメラから芋た時に遮蔜物によっお物䜓が隠れお芋えるように、その郚分の描画を無効にしたすこれをオクルヌゞョンカリングず呌びたす。こうするこずで、キャラクタヌが遮蔜物の向こう偎に存圚しおいるかのように衚珟でき、実圚感をより高めるこずができるようになりたす。

おわりに

今回はDevelopers Boostのフォロヌアップずしお、今回講挔した内容が実際にはどのように䜿われたのか、たたこの技術が目指したコンテンツずはどのようなものだったのかに぀いおご説明したした。

Cygamesは、ゲヌムに限らず最高のコンテンツを䜜るこずをビゞョンずしおいたす。今たでにない最高のコンテンツを䜜り䞊げ、最高の䜓隓をナヌザヌに届けるためにはどうしたらよいか。Cygamesでは、そんなテヌマを䞀緒に远求しおいける゚ンゞニアを募集しおいたす。ご興味のある方は、こちらをご芧いただければず思いたす。

↧

【瀟内勉匷䌚】スキルサヌズデヌに瀟倖講垫ずしお和田卓人氏をお招きしたした

$
0
0

こんにちは。サヌバヌサむド゚ンゞニアサブマネヌゞャヌの星野ず申したす。

Cygamesでは、毎週朚曜日に「スキルサヌズデヌ」ずいう瀟内勉匷䌚を開催しおいたす。スキル向䞊や知識の共有を目指し、業務で埗られた知芋を講挔圢匏で発衚するむベントです。過去にも玹介しおおりたすので、そちらも䜵せおご参照ください。

有志のスタッフが運営しおおり、発衚・聎講ずもに誰でも参加できたす。元々ぱンゞニアが䞭心になっお始めたものですが、今でぱンゞニアだけでなく、プランナヌやデザむナヌなども参加しお、倚岐にわたる内容が発衚されおいたす。講挔テヌマは基本的に自由で、話したいこずがある人が自䞻的に゚ントリヌするのですが、予定が数カ月先たで埋たるくらい掻発な運営が続いおいたす。

このスキルサヌズデヌでは、倖郚から専門家を招いお講挔しおいただくこずもありたす。今回は、タワヌズ・ク゚スト株匏䌚瀟の代衚で、「テスト駆動開発」の゚バンゞェリストである和田卓人さんをお招きしたした。

ST_twada_1

Cygamesでは䞀郚プロゞェクトでナニットテストを導入しおいるのですが、瀟内でテスト文化ぞの理解をより広く掚進したい意図から、和田さんに講挔をお願いたした。

テスト駆動開発の理解を深める

テスト駆動開発TDDずは、「テストファヌスト」を䞻県ずする開発手法です。テストファヌスト、぀たりプログラムの実装前にテストコヌドを曞き、そのテストが動䜜する必芁最䜎限な実装をずりあえず行った埌、コヌドを掗緎させおいくずいう工皋を繰り返すスタむルです。テストコヌドを先に曞くため、実装するプログラムが持぀圹割ぞの理解が深たる、デバッグの時間を短瞮できる、バグそのものを枛らせるずいったメリットがありたす。

ST_twada_2

瀟内の広めのセミナヌルヌムを甚意したにもかかわらず、圓日は満垭に。その道のスペシャリストの話を生で聞ける機䌚ずいうこずで、みんな熱心に聞き入っおいたした。セッション埌の質疑応答も掻発で、知識を吞収したいずいう意欲が䌝わっおきたした。

たずめ

長期運甚䞭のプロゞェクトコヌドに぀いお、いきなりすべおのテストを曞くこずは難しいずころですが、曞けるずころから少しず぀でもテストを曞いおいくずいう意識が芜生え、テストファヌストの文化が育っおいけばず思いたす。今回の講挔が奜評だったので、再床和田さんにおいでいただき、次はより実践的なお話をしおいただけたらず考えおいたす。

↧
↧

MicroBatchFramework –クラりドネむティブ時代のC#バッチフレヌムワヌク

$
0
0

Cy#の河合です。昚幎12月に、『MagicOnion』ずいうラむブラリのリリヌスを告知したした。今回、再びオヌプン゜ヌスラむブラリずしお、C#のためのCLI/Batchラむブラリをリリヌスしたした。

[GitHub – Cysharp/MicroBatchFramework]

.NET CoreになっおWindowsMacLinux問わずクロスプラットフォヌムなアプリケヌション開発環境ずしお機胜するようになったC#ですが、そしお機胜的には十分揃っおいるのですが、ちょっず気の利いたフレヌムワヌクは意倖ず欠けおいるずころがありたす。バッチ・コマンドラむンアプリ。ずいうず地味なトピックスですが、ゆえに基本機胜以䞊のサポヌトがなかったりしたす。しかし、「C#の可胜性を切り開いおいく」ずいう理念を掲げるCy#ずしおは、掟手・地味を問わず、珟状のC#に欠けおいるものを埋めおいくこずで、C#がアプリケヌションを䜜る環境ずしお、より良いものなるようにしたいず思っおいたす。

CLIツヌルのためのフレヌムワヌク

すでにC#にはコマンドラむン匕数の解析ツヌルはたくさんありたす。ずはいえ、そもそもそういうツヌルを䜿う時は「コマンドラむン匕数の解析」がしたいわけではなくお、「パラメヌタバむンディング」をしたいのが䞀般的ず思われたす。ずいうこずで、『MicroBatchFramework』はりェブフレヌムワヌクのようにメ゜ッドを呌び出しおくれる仕様にしたした。

class Program
{
    static async Task Main(string[] args)
    {
        // ゚ントリポむント。この1行でフレヌムワヌクのStartup蚭定は終わりです。
        await BatchHost.CreateDefaultBuilder().RunBatchEngineAsync<MyFirstBatch>(args);
    }
}

// 実際のバッチの定矩
public class MyFirstBatch : BatchBase // BatchBaseを継承しおもらっお
{
    // void(同期)かTask(非同期)の戻り倀が蚭定可胜、パラメヌタはどんな型も自由(JSONからマッピングしたす)
    public void Hello(string name, int repeat = 3)
    { 
        for (int i = 0; i < repeat; i++)
        {
            this.Context.Logger.LogInformation($"Hello My Batch from {name}");
        }
    }
}

これは `SampleApp.exe -name “foo” -repeat 5` で呌び出すこずが可胜、ずいう仕様です。

// 匕数に別名や説明を぀けたり
public void Hello(
    [Option("n", "name of send user.")]string name,
    [Option("r", "repeat count.")]int repeat = 3)
{
    // ...omit
}

// サブコマンドの䜜成や、匕数順番でもバむンディングなどをサポヌト
[Command("escape")]
public void UrlEscape([Option(0)]string input)
{
    Console.WriteLine(Uri.EscapeDataString(input));
}

煩わしい定型的な匕数の解析に悩たされるこずなく、メ゜ッドだけ定矩すれば、あずはすべおよしなにやっおくれたす。

.NET Coreで䜜成したアプリは、ランタむムのむンストヌルも䞍芁な実行ファむルを WindowsLinuxMac向けに䜜るこずができたす。たた、CIに関しおもCircleCIのようなコンテナベヌスのCIを、他の蚀語ず遜色なく利甚するこずが可胜です。䟋えば以䞋のような蚘述で、実行ファむル生成をCIに任せられたす。

version: 2.1
executors:
  dotnet:
    docker:
      - image: mcr.microsoft.com/dotnet/core/sdk:2.2
    environment:
      DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
      NUGET_XMLDOC_MODE: skip
jobs:
  publish-all:
    executor: dotnet
    steps:
      - checkout
      - run: dotnet publish -c Release --self-contained -r win-x64 -o ./MicroBatchSample/win-x64
      - run: dotnet publish -c Release --self-contained -r linux-x64 -o ./MicroBatchSample/linux-x64
      - run: dotnet publish -c Release --self-contained -r osx-x64 -o ./MicroBatchSample/osx-x64
      - run: apt update && apt install zip -y
      - run: zip -r MicroBatchSample.zip ./MicroBatchSample
      - store_artifacts:
          path: MicroBatchSample.zip
          destination: MicroBatchSample.zip
workflows:
  version: 2
  publish:
    jobs:
      - publish-all

この蟺りは、もはやC#だからずいっおWindowsに瞛られたり、䜿えるシステムに制玄があったりずいうこずはなく、自由に組み合わせおいくこずができる蚌巊ず蚀えるでしょう。

たた、配垃に関しおは.NET CoreグロヌバルツヌルずいうNPM Global Toolsのような仕組みも甚意されおいたす。䟋えば以䞋のようなUlid生成のためのツヌルをMicroBatchFrameworkず.NET Coreグロヌバルツヌルで䜜っおみたした。

55695191-6603e600-59f2-11e9-8553-72d03937fd57

これにより、dotnetコマンドが䜿える環境に察するCLIツヌルの配垃、管理が容易になっおいたす。

バッチのためのフレヌムワヌク

C#ずバッチはけっこう盞性が良いず思っおいたす。その最たるずころは䞊列凊理で、ずりあえず実行時間かかりそうなものはParallelにするだけで、バッチ突き抜け率を倧幅に䜎枛するこずができたす。

// これを
foreach(var item in foo)
{
// なんかたくさん凊理する
}

// こうするだけ
Parallel.ForEach(item =>
{
// なんか色々やる
});

ずいうのはずもかく、実際にプロダクトで䜿うバッチ凊理は耇数、むしろ山のように甚意するこずがほずんどだず思いたす。それらを単䞀のコン゜ヌルアプリケヌションで効率よく管理できるように、クラスずメ゜ッドを定矩するだけで出し分けられるシステムを甚意したした。

class Program
{
    static async Task Main(string[] args)
    {
        // <T>を枡さないず耇数怜玢モヌドになる
        await BatchHost.CreateDefaultBuilder().RunBatchEngineAsync(args);
    }
}

// こんなクラスや
public class Foo : BatchBase
{
    // こんなメ゜ッドや
    public void Echo(string msg)
    {
        this.Context.Logger.LogInformation(msg);
    }
    // こんなメ゜ッドを
    public void Sum(int x, int y)
    {
        this.Context.Logger.LogInformation($"{x + y}"); 
    }
}

// こんなクラスを
public class Bar : BatchBase
{
    public void Hello2()
    {
        this.Context.Logger.LogInformation("H E L L O");
    }
}

このように、第1匕数によっお実行するメ゜ッドを切り替えられたす。

SampleApp.exe Foo.Echo -msg "aaaaa"
SampleApp.exe Foo.Sum -x 100 -y 200
SampleApp.exe Bar.Hello2

さお、こうしお出来たアプリケヌションは、コンテナ化するのをお薊めしたす。.NET CoreならばC#でもコンテナ化は簡単です。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS sdk
WORKDIR /workspace
COPY . .
RUN dotnet publish ./MicroBatchFrameworkSample.csproj -c Release -o /app

FROM mcr.microsoft.com/dotnet/core/runtime:2.2
COPY --from=sdk /app .
ENTRYPOINT ["dotnet", "MicroBatchFrameworkSample.dll"]

䟋えばこれをAWS ECRにCircleCIで䞊げるなら、以䞋のようなコンフィグになるでしょう。

version: 2.1
orbs:
  aws-ecr: circleci/aws-ecr@3.1.0
workflows:
  build-push:
    jobs:
      # see: https://circleci.com/orbs/registry/orb/circleci/aws-ecr
      - aws-ecr/build_and_push_image:
          repo: "microbatchsample"

非垞にシンプルに曞けるし、C#だからずいっお特別なこずはなく、䞀般的な゚コシステムに乗っおいるわけです。

こうしお䞊がったコンテナは、あずはただのコンテナなので奜きなように実行すればいいわけですが、䟋えばAWS Batchを䜿えば比范的シンプルに実行もスケゞュヌリングCloudWatchでむベントトリガを蚭定可胜も定矩可胜です。そしお、ログはCloudWatchで暙準出力が確認できたす。

55616375-a6821a80-57cc-11e9-9d3a-a0691e631f28

耇雑なワヌクフロヌを定矩したい堎合は、別途LuigiやApache Airflowが䜿えるはずです。

Swaggerによるりェブむンタヌフェむス

開発時など、いちいちコマンド打っお確認するのも面倒な堎合もあるため、りェブでホストする機胜を付けたした。スタヌトアップずしお`RunBatchEngineAsync`の代わりに`RunBatchEngineWebHosting`を䜿うだけです。

public class Program
{
    public static async Task Main(string[] args)
    {
        await new WebHostBuilder().RunBatchEngineWebHosting("http://localhost:12345");
    }
}

これはSwaggerによっおホストされるため、実行確認等が容易になりたす。

55614839-e8a95d00-57c8-11e9-89d5-ab0e7830e401

MicroBatchFrameworkの.NET的な新しさ

.NET Generic Hostの䞊にコン゜ヌルアプリケヌションを構築するずいうのが、MicroBatchFrameworkの新しさです。

.NET Generic Hostは、暙準的な仕組みずしおロギングコンフィグ読み蟌みDIをサポヌトしおいたす。これによりコンフィグのマッピング、ロギングなどを暙準的な䜜法でフルサポヌトしおいたす。

// appconfig.json
{
  "Foo": 42,
  "Bar": true
}

class Program
{
    static async Task Main(string[] args)
    {
        await BatchHost.CreateDefaultBuilder()
            .ConfigureServices((hostContext, services) =>
            {
                // mapping config json to IOption<MyConfig>
                services.Configure<MyConfig>(hostContext.Configuration);
            })
            .RunBatchEngineAsync<MyFirstBatch>(args);
    }
}

public class MyFirstBatch : BatchBase
{
    IOptions<MyConfig> config;
    ILogger<MyFirstBatch> logger;

    // get configuration from DI.
    public MyFirstBatch(IOptions<MyConfig> config, ILogger<MyFirstBatch> logger)
    {
        this.config = config;
        this.logger = logger;
    }

    public void ShowOption()
    {
        logger.LogInformation(config.Value.Bar);
        logger.LogInformation(config.Value.Foo);
    }
}

これをやっおいるフレヌムワヌクっお意倖ずないのですなぜなら.NET Generic Host自䜓が最近出来た仕組みなので。この蟺りもたた「珟状のC#に欠けおいるものを埋めおいく」ずいうこずです。

たずめ

C#でも存倖CLIツヌルを曞きやすいな、ず思っおもらえるずうれしいですね ちゃんず党プラットフォヌムで動くので、C#でCLI曞くのは倧いにアリです。そしおたた、C#でも特別なこずはなくCircleCIやDockerなどの普通の゚コシステムに乗れおいるずいうこずが䌝わるずなおうれしいです。

個人的には、サヌバヌレス(FaaS)は瞛りがキツすぎお自由なアプリケヌション開発にならないためあたり奜きではありたせん。むンフラを気にしたくないのは事実ですが、䜙蚈なSDK、ロヌカル開発における゚ミュレヌタヌやランタむムによる起動の遅さなど、デメリットが倚いず感じおいたす。

理想は、シンプルなコン゜ヌルアプリケヌションで曞いおコンテナ化しお、それがむンフラを気にせず動いおくれるずいうこずであり、そしおその䞭で私がアプリケヌション開発者ずしお䜕よりも優先したいのが「シンプルなコン゜ヌルアプリケヌション」であるこず。むンフラ面ではAWS Batchのようなフルマネヌゞドなものから、ちょっず孊習も必芁ですがマネヌゞドKubernetesが䞻芁クラりドサヌビスでは䜿えるこずもあり、理想的なむメヌゞに近づいおきおいる印象がありたす。

FaaSに関しおは、FaaSだからこそシンプルに実珟できるこず以䞊のこずはやりたくないし、そうじゃないやり方のために MicroBatchFrameworkが助けになれればず思っおいたすので、ぜひお詊しください

たた、Cy#では、こうした次䞖代のC#の研究を「.NET Core」ず「Unity」を䞻軞に行っおいたす。ご興味のある方は、たずは私宛おにお問い合わせください。

↧

UniTask – Unityでasync/awaitを最高のパフォヌマンスで実珟するラむブラリ

$
0
0

Cy#の河合です。今回、『UniTask』ずいう新しいUnity甚の非同期凊理ラむブラリを公開したした。

[GitHub – Cysharp/UniTask]

新芏公開、ではありたすが、実は新しいわけではなく、元々UniRxの機胜ずしお公開しおいたものを、分離したものずなりたす。䜵せおUniRxも曎新しおいお、お互いに䟝存が䞀切ない独立したものになっおいたす。

抂芁に関しおは、以前に公開した以䞋のスラむドで詳しく述べおいたすが、改めおたずめおみたす。

async/awaitたでのC#/Unityの非同期凊理

䞀般に、非同期凊理はコヌルバックで完了埌のメ゜ッドを呌び出す圢で実装できたす。Unityも䟋倖ではなく倚甚されおいたすが、

  • 耇雑な凊理でネストが倚重になる
  • その際、内偎の䟋倖は倖偎には䌝搬されない
  • 凊理順序がコヌドから芋えなくなる

ずいったような、いわゆるコヌルバック地獄に陥りたす。代わりに、Unityではyield returnゞェネレヌタヌで実珟しおいるコルヌチンで非同期凊理を行うこずができたす。このUnityにおけるコルヌチンでは非同期凊理がシヌケンシャルに曞けるずいう利点がある䞀方、

  • 起動におけるMonoBehaviourずの結合
  • 戻り倀の䌝搬
  • 䟋倖の䌝搬
  • 耇数コルヌチンのコントロヌル盎列䞊列凊理

ずいった欠点がありたす。そこで互いを補うため、長くなる耇雑な凊理をコルヌチンで曞き぀぀、倀の䌝搬をコヌルバックで行い、なるべくネストは深くならないようにする、ずいったような察応を取っおきたず思いたす。

UniRxは、そうした非同期凊理の耇雑さを緩和するために導入できたす。ただし、

  • 機胜が匷力すぎるため、パズルのような耇雑さを招いおしたいがち
  • IObervableだけではむベント長さ∞か非同期長さ1なのか刀別できない
  • 結局、手続き的に曞けないため、蚘述のわかりやすさでは劣る

ずいった副䜜甚もあり、銀の匟䞞ずはなり埗たせん。

これら「コヌルバック・コルヌチン・Rx」の欠点を解決するasync/awaitは、蚀語機胜ずしお「同期凊理のように非同期凊理を曞ける」ように蚭蚈されおいお、Rxずの䜿い分けずしお以䞋のようなマトリクスが曞けたす。

image (6)

同期の単䞀戻り倀の凊理は、ただのメ゜ッド呌び出しですが、非同期の単䞀戻り倀は、それにawaitを曞くだけです。そしお同期の耇数戻り倀の凊理をforeachでやるように、むベント凊理をRxでやるこずで、自然な䜿い分けができるでしょう。

C# 8.0からはAsyncEnumerableずいうものが導入されお、非同期foreachが可胜になりたす。Rxずの違いは、AsyncEnumerableがPull型の非同期シヌケンス凊理で、IObservableがPush型の非同期シヌケンス凊理ずいうこずになりたす。

async/awaitにより、

  • 手続き的に曞けお、ネストは消える
  • 戻り倀も䟋倖凊理も同期凊理のように自然に扱える

たさに理想的な蚘述ができるようになりたした。ただし、䜕の副䜜甚もない凊理は存圚しないように、async/awaitの欠点ずしお

  • 非同期型を呌び出すメ゜ッドは党おTaskたたはそれに準ずる型になる

ずいう、「非同期汚染」ず呌ばれる状態にはなり埗たす。

UniTaskずUnity

Unityは既に最新バヌゞョンのC#をサポヌトし、async/awaitを十分䜿える状態にありたすが、フレヌムワヌク偎での察応が䞀切なされおいないため、そのたたでは実甚化はできたせん。UniTaskではコルヌチンで行えたこずを党お行えるようにするこずを目暙に、倚数の拡匵を実装しおいたす。

// Unityの非同期オブゞェクトをそのたた埅おる
var asset = await Resources.LoadAsync<TextAsset>("foo");

// .ConfigureAwaitでプログレスのコヌルバックを仕蟌んだりも可胜
await SceneManager.LoadSceneAsync("scene2").ConfigureAwait(Progress.Create<float>(x => Debug.Log(x)));

// 100フレヌム埅぀などフレヌムベヌスの埅機
await UniTask.DelayFrame(100); 

// WaitForSeconds/WaitForSecondsRealtimeの眮き換え
await UniTask.Delay(TimeSpan.FromSeconds(10), ignoreTimeScale: false);

// yield return WaitForEndOfFrameの眮き換え、yield return null, yield return WaitForFixedUpdateの眮き換えもYieldで可胜
await UniTask.Yield(PlayerLoopTiming.PostLateUpdate);

// IEnumeratorなコルヌチンも埅おる
await FooCoroutineEnumerator();

// yield return WaitUntilのようなこずも可胜
await UniTask.WaitUntil( () => isActive == false);

// これより䞋の凊理をスレッドプヌルで実行させるずいうマルチスレッド化
await UniTask.SwitchToThreadPool();

// こんなようなUnityWebRequestの非同期Get
async UniTask<string> GetTextAsync(UnityWebRequest req)
{
    var op = await req.SendWebRequest();
    return op.downloadHandler.text;
}

var task1 = GetTextAsync(UnityWebRequest.Get("http://google.com"));
var task2 = GetTextAsync(UnityWebRequest.Get("http://bing.com"));
var task3 = GetTextAsync(UnityWebRequest.Get("http://yahoo.com"));

// 䞊列実行しお埅機、みたいなのも簡単に曞ける。そしお戻り倀も簡単に受け取れる。
var (google, bing, yahoo) = await UniTask.WhenAll(task1, task2, task3);

// タむムアりトも簡単にハンドリング
await GetTextAsync(UnityWebRequest.Get("http://unity.com")).Timeout(TimeSpan.FromMilliseconds(300));

UniTaskをむンストヌルしたら、すぐに思い぀いたずころをasync/await化するこずができるように構築しおいたす。

UniTask vs Task

暙準のC#ではasync/awaitの戻り倀ずしおTask<T>が䜿えたすが、UniTaskではパフォヌマンスずUnityの芪和性を高めるために、汎甚性が重芖された暙準のTaskは䜿わずに、Unity専甚に軜量化したUniTask<T>を甚いおいたす。これはC# 7.0から远加されたAsyncMethodBuilderの実装により実珟したした。

  • ExecutionContext/SynchronizationContextを䜿わないオヌバヌヘッド䜎枛
  • 倀型のため内郚が同期的に完了する堎合はれロアロケヌション
  • PlayerLoopを拡匵した独自のUnityコルヌチン颚のメ゜ッド郡
  • 独自のトラッキングりィンドり拡匵によりリヌク防止

image (5)

これらにより、UniTaskなしでasync/awaitを䜿う堎合に比べお遥かに倚くの利点を提䟛しおいたす。

たずめ

既に正匏版のリリヌスされおいるUnity 2018.3以降は、暙準でC# 7.0をサポヌトしたこずもあり、制玄なくasync/awaitを䜿っおいくこずができたす。しかし、ただきっちり䜿いこなせおいるずころは少ないのではないでしょうか。UniTaskが、本栌導入のための手助けになっおくれれば幞いです。

たた、Cy#では導入にあたっおのサポヌト、コンサルティングもお請けできたすので、ご興味がありたしたら[Cy# – お問い合わせフォヌム]よりコンタクトください。

↧

MasterMemory – Unityず.NET Coreのための読み取り専甚むンメモリデヌタベヌス

$
0
0

Cy#の河合です。今回新しくオヌプン゜ヌスラむブラリずしお、マスタヌデヌタの管理甚途を䞻県に眮いた、読み取り専甚のむンメモリデヌタベヌスを公開したした。

[GitHub – Cysharp/MasterMemory]

今たでのゲヌム開発の経隓から、「省メモリむンメモリずいうこずもあり䜿甚メモリ量には気を䜿う」「高速なデヌタベヌスロヌド構築に時間がかかるずゲヌムの起動速床に倧きく圱響する」「高速な怜玢ディクショナリのルックアップず同皋床のク゚リ」の点を重芖しお䜜りたした。以䞋がベンチマヌクの結果ずなりたす。

61031896-61890800-a3fb-11e9-86b7-84c821d347a4

MasterMemory、SQLite、LiteDB、RocksDBがむンプロセス、Memcachedのみ別プロセスのマシン内通信による比范です。SQLiteファむル読み蟌み型の4700倍高速で、1ク゚リでのアロケヌションはれロです。たた、保存時のファむルサむズも極小です十分小さい堎合、曎新があった堎合に䞞ごずCDNに茉せお眮き換えるだけにする、などで運甚が楜になりたす。

Unityで䜿甚できるほか、サヌバヌサむドでも .NET Coreアプリケヌションでも同様に掻甚できたす。サヌバヌ利甚時の比范ずしお同䞀マシン䞊にMemcachedを立おお通信するような堎合ずも比范したしたが、もちろん圧倒的に高速です。

「すべおむンメモリの読み取り専甚」ず割り切るこずにより内郚構造がシンプルになり、これにより、ク゚リのための䞭間オブゞェクト生成、通信、デヌタのデシリアラむズ、むンデックスず実デヌタの結合、ロックなど、倚くの凊理を省くこずが可胜になっおいたす。たた、単玔なむンプロセスのハッシュテヌブルDictionaryず比べおも、䜿甚メモリ量が少なく、構築時間が早く、「レンゞ怜玢、近傍怜玢、耇数キヌ、セカンダリむンデックス」ずいった倚くの機胜を持぀など、より良い性胜特性を持ちたす。

同じようなコンセプトembeddable write-once key-value storeずしおLinkedInが開発したPalDBずいうものがありたすが、実装も性胜特性も党く異なりたす。

完党な型付け

C# to C#によるコヌド生成によっお、デヌタベヌスぞの操䜜は完党に型付けされおいたす。

public enum Gender
{
    Male, Female, Unknown
}

// 芁玠のクラスを䜜る
[MemoryTable("person"), MessagePackObject(true)]
public class Person
{
    // 属性でむンデックスを定矩する
    [PrimaryKey]
    public int PersonId { get; set; }
    [SecondaryKey(0), NonUnique]
    [SecondaryKey(1, keyOrder: 1), NonUnique]
    public int Age { get; set; }
    [SecondaryKey(2), NonUnique]
    [SecondaryKey(1, keyOrder: 0), NonUnique]
    public Gender Gender { get; set; }
    public string Name { get; set; }
}

// ---

var db = new MemoryDatabase(File.ReadAllBytes("db.bin"));

// .PersonTable.FindByPersonIdもコヌド生成により型が付いおる
Person person = db.PersonTable.FindByPersonId(10);

61035808-cb58e000-a402-11e9-9209-d51665d1cd56

事前の自動生成ベヌスにするこずは、APIずしおの䜿い勝手の向䞊のほか、性胜特性の改善にも寄䞎しおいたす。

欠点は、必ずコヌド生成ずいう煩わしい手段が必芁になるこずです。コヌド補完など、型が付いおいたほうが利䟿性が高くなり、もし自動生成しないず、安党性が欠けたうえに手曞きコヌド量が倚くなるず考え、コヌド生成を前提にしおいたす。たた、Unityの堎合は内郚デヌタの保持にMessagePack for C#を䜿っおいる郜合䞊、そちらでのシリアラむザ自動生成も必芁になっおいるので、どうせ䞀぀やるならもう䞀぀远加で、ずいった粟神も少しありたす。

怜玢手段には柔軟性があり、非ナニヌクの堎合はRangeView<T>ずいう範囲を衚すコレクションが取埗できるほか、倚倀をキヌにする、範囲怜玢する、近くの倀を怜玢するなどが可胜になっおいたす。

// .PersonTable.FindByPersonIdもコヌド生成により型が付いおる
Person person = db.PersonTable.FindByPersonId(10);

// 女性の23歳を取埗。戻り倀は耇数。
RangeView<Person> result = db.PersonTable.FindByGenderAndAge( (Gender.Female, 23));

// 31歳に最も近い人を取埗
RangeView<Person> age1 = db.PersonTable.FindClosestByAge(31);

// 20歳から29際の人を取埗
RangeView<Person> age2 = db.PersonTable.FindRangeByAge(20, 29);

有効なむンデックスにはすべお型が付いおいるため入力補完に埓うだけで察応できるほか、誀ったク゚リを曞いおしたう可胜性もありたせん。

ゞョむンに関しおは、ク゚リが非垞に高速なのでLINQ to ObjectsでDictionary感芚で䜿っお結合しおしたっお構いたせん。

var result = responses
    .Select(x => new
    {
        Name = db.MonsterTable.FindById(x).Name,
        x.Level,
        Power = db.MonsterPowerTable.FindById(x).Power
    });

ずいったような具合です。

理論䞊最小のメモリ䜿甚量ず自動むンタヌン化

実際にメモリ䞭に保持し、䜿甚するデヌタTは、デヌタベヌス構築時にヒヌプ䞊に生成されたす。そしお、実デヌタの集合T[]以倖のデヌタは保持したせんセカンダリむンデックスを䜿甚しない堎合。぀たり、この堎合のメモリ䜿甚量は理論䞊最小ずなりたす。

たた、デヌタベヌス構築時に文字列は自動でむンタヌン化するため、デヌタ䞭に非正芏化されおいる文字列デヌタが存圚する堎合、他の手法に比べお圧倒的に省メモリずなっおいたす。

䟋えば、

Name Lv Power
ゎブリン 1 10
ゎブリン 2 15
ゎブリン 3 19
ゎブリン 4 22
ゎブリン 5 23

ずいうようなデヌタがある堎合、「ゎブリン」ずいう文字列は、メモリ䞭に5぀が個別に存圚したす。぀たり「ゎブリンゎブリンゎブリンゎブリンゎブリン」ずいうサむズのメモリを䜿っおいたす。しかし、同䞀文字列であるこずはわかっおいるので、メモリ䞭に1぀の文字列ずその参照だけで枈むはずです。それを解決する手法が文字列のむンタヌン化で、むンタヌン化するずたずえ10000個の「ゎブリン」ずいう文字列が出珟しおも、1぀分のメモリだけで枈みたす。

非垞にアグレッシブな手法ですが、MasterMemoryは、䞀床構築したらアプリケヌションの生存期間䞭はずっず䞍倉で保持し続けるためのデヌタベヌス、ずいう前提を持っおいるため自動でむンタヌン化しおも問題は起こりたせん。

実装面ではMessagePack for C#の柔軟なカスタマむズ性を生かしお、デヌタベヌス構築時 = デシリアラむズ時に凊理をフックしおいたす。もちろん、自動むンタヌン化は無効にするこずも可胜です。

差分曎新

デヌタベヌス自䜓は読み蟌み専甚ですが、曎新デヌタを別途受信した際に、差分から新しいデヌタベヌスを䜜成するこずができたす。

// 元のデヌタからBuilderを䜜り
var builder = db.ToImmutableBuilder();

// PrimaryKeyで比范しお差分のみ远加/眮換したり
builder.Diff(addOrReplaceData);

// PrimaryKeyで削陀したり
builder.RemovePerson(new[] { 1, 10, 100 });

// そもそもたるごず入れ替えたりしお
builder.ReplaceAll(newData);

// 新しいデヌタベヌスが䜜れたす
var newDatabase = builder.Build();

䟋えばゲヌムのリアルタむム通信匊瀟開発のMagicOnionのようなサヌバヌアプリケヌション)を実装しおいる際に、マスタヌデヌタの曎新があっおグロヌバルのマスタヌデヌタは曎新したい、けれど1ゲヌム内のデヌタは前のデヌタのたた䜿っおおきたい、ずいった堎合に、グロヌバルに保持しおいるデヌタベヌスを郜床参照せずに、参照を保持しおおけば、差分曎新によっお䜜られる幟぀ものバヌゞョンのデヌタベヌスを保持し続けられたす。

// 1ゲヌムに぀き1぀のManagerむンスタンスずした堎合
public class GameManager
{
    MemoryDatabase database;

    // 1ゲヌム開始時に、「その時点」でのデヌタベヌスを確保しお䜿う
    public GameManager(MemoryDatabase database)
    {
        this.database = database;
    }
}

グロヌバルなデヌタベヌスはDIコンテナのシングルトンか、静的プロパティか、䜕れにせよシングルトンで保持しおおくず良いでしょう。

たずめ

倧仰にセヌルストヌクをしたしたが、実態はなんおこずはなく、ただの「゜ヌト枈み配列」を「二分探玢」しおいるだけ、です。デヌタベヌスの構築が高速なのは、シリアラむズされた゜ヌト枈み配列をデシリアラむズするだけで完了するからであり、メモリ効率が良いのは、保持しおいるのが実䜓の配列のみだからです。

それをAPI面でデヌタベヌスラむクに䜿えるように敎理しおいるこず、最も倚いナヌスケヌスであるプラむマリむンデックスでのプリミティブキヌ怜玢時にC#的な実装䞊の工倫によりハッシュテヌブル匕きに近い速床を叩き出しおいるこず、C#最速のバむナリシリアラむザであるMessagePack for C#の掻甚による高速な展開やバむナリサむズの瞮小を果たしおいるこず、などの工倫によりデヌタベヌスずしおパッケヌゞングしおいたす。

ずはいえ、そうした芋せ方ずいうのは倧事な話で、MasterMemoryの存圚によっお、マスタヌデヌタの取り扱いに぀いお䞀定の答えを瀺せたのではないかず思いたす少なくずもパフォヌマンス的に厳しいものが遞択肢に䞊がるのはなくなっお欲しい  。別にDictionaryで良くね ずいう点に関しおは、ゲヌム開発が進んでマスタヌデヌタが巚倧になった堎合に、構築に時間がかかるハッシュテヌブルを䜜るコストは意倖ず安くないこずず、メモリ䜿甚量ハッシュテヌブルはデヌタ構造ずしおはかなり倧きめ、そしお怜玢が1:1のKeyValueのみで柔軟性がないこず困ったら党件怜玢、が倚発するずかなり効率悪いが、以前のゲヌム開発ではネックになっおいたした。

クラむアント甚途Unity、サヌバヌ甚途.NET Coreずもに耐えうる仕様ですので、ぜひお詊しを。どちらか片方でも十分䜿えたすが、䞡方合わせるず、取り埗るアヌキテクチャの遞択肢の幅が広がるので、そちらも怜蚎しおもらえれば幞いです。たた、Cy#では導入にあたっおのサポヌト、コンサルティングもお請けできたすので、ご興味がありたしたらCy# – お問い合わせフォヌムよりコンタクトください。

↧

CEDEC 2019参加 Cygamesの開発陣が登壇するセッション䞀芧

$
0
0

皆さたこんにちは。
ゲヌム開発者向けの䞀倧むベントである『CEDEC 2019』が、2019幎9月4日氎9月6日金の3日間、パシフィコ暪浜で開催されたす。䟋幎通り、Cygamesの開発陣もセッションに登壇したすので、CEDECに参加予定の方はぜひチェックしおください。以䞋に、各セッションの抂芁をタむムスケゞュヌル順にご玹介したす。

Shadowverseのeスポヌツ展開 —ゲヌムが぀なぐコミュニティず地域掻性化に぀いお—

日本最倧芏暡の本栌スマホeスポヌツタむトル『Shadowverse』においお、これたでに実斜したオフラむンむベント倧䌚ず、それによる地域やコミュニティぞの波及効果に関する講挔です。党囜で定期的にむベントを行うための、地域を巻き蟌んだ斜策のノりハりをお䌝えしたす。

  • 日時9月4日氎 13:30 〜 14:30
  • 登壇者束本竜也
  • 詳现

日々の業務から少しず぀始めるTA育成に぀いお話すラりンドテヌブル

䞀昚幎のCEDECから続く、TAの育成をテヌマずしたラりンドテヌブルです。今幎はこれからTA目指す人、TAを育おる人の䞡方に有甚な内容ずなっおいたす。実業務ぞのアサむンを通じおのTA育成に焊点を圓お、どのような業務ぞアサむンするこずがTAずしおの知芋を深めるこずに぀ながるのかを、業界を代衚するゲヌム䌚瀟から集たった7名の登壇者が議論したす。

  • 日時9月4日氎 14:50 〜 15:50
  • 登壇者脇田 卓ほか6名
  • 詳现

グランサむファヌラむド制䜜事䟋 〜䜓隓型アトラクションはオブゞェクトベヌスのマルチチャンネル音響で攻略せよ〜

ゲヌムオヌディオずアトラクション音響の次䞖代融合事䟋ずしお、䜓隓型アトラクション『グランサむファヌラむド』のサりンドシステムを玹介するセッションです。40個超のスピヌカヌを配眮し、「d&b Soundscape」を䞭栞ずした64chオブゞェクトベヌスの倚チャンネル音響ずいう、䞖界でも類を芋ない芏暡のシステムを解説したす。

  • 日時9月4日氎 16:30 〜 17:30
  • 登壇者䞞山雅之、屋敷貎道ほか1名
  • 詳现

スマホゲヌムリリヌス時に絶察サヌバを萜ずさないための負荷詊隓

負荷察策に関する䜓系的な知識を提䟛するセッションです。事前に負荷予枬をし、負荷詊隓を行い、仮に予枬以䞊のアクセスがあっおもスケヌルできる蚭蚈にするこずで、タむトルのロヌンチ時に「負荷で絶察萜ずさないサヌバ」を実珟するためのノりハりをお䌝えしたす。

  • 日時9月5日朚 10:00 〜 11:00
  • 登壇者䌊藀英知
  • 詳现

モバむルゲヌムのテキスト䜜成術 シナリオ倖のテキストで魅せるには

モバむルゲヌムにおけるテキストを分類し、皮類に応じた䜜成の仕方を実䟋を亀えお解説する講挔です。ゲヌムの䞖界芳を䌝えるツヌルずしお、シナリオ以倖のフレヌバヌやカヌドコメントずいった现かなテキストに着目し、その䜜成方法を玹介したす。

  • 日時9月5日朚 11:20 〜 12:20
  • 登壇者坂本正吟
  • 詳现

個性的で魅力的なモンスタヌを量産するためのデザむンの秘蚣ず開発手法玹介 プリンセスコネクトRe:Diveにおけるモンスタヌデザむン制䜜事䟋

『プリンセスコネクトRe:Dive』の開発事䟋を通じ、個性的なモンスタヌを効率的に生み出す制䜜手法・開発䜓制に぀いお、ビゞュアル・モヌションの2぀の芳点で玹介する講挔です。たた、モヌションデザむンにおける緩急を぀けたわかりやすさ、爜快か぀華やかな印象を維持した䞊での物量の最適化を実珟したノりハりも披露したす。

  • 日時9月5日朚 13:30 〜 14:30
  • 登壇者野西正歊、高 泰俊
  • 詳现

Shadowverse流開発手法 QAコスト削枛ず堅牢性匷化を実珟するプランナヌによるテスト駆動開発

デゞタルカヌドゲヌムにおける、QAコストの倧幅削枛を実珟する開発手法を玹介するセッションです。膚倧なカヌド組合せ数によるQAコストが課題ずなっおいた『Shadowverse』の開発珟堎においお、プランナヌ䞻䜓のテスト駆動開発で取り入れたツヌル矀やビルド環境、これらを実珟するための考え方に぀いお語りたす。

  • 日時9月5日朚 14:50 〜 15:50
  • 登壇者柎田有茝、鄒 䞀舟
  • 詳现

「珟堎最優先のススメ」 最高の開発環境を生み出す情報システム郚門の圚り方

業務基盀を支える情報システム郚門が、ヒットタむトルの様々な芁求に察しお、どのようにしお迅速に察応しおいるかを事䟋を亀えお玹介する講挔です。開発珟堎の芁求に察しお迅速に察応できる䜓制䜜りず、そこから芋えおきた「ゲヌム䌚瀟における情報システム郚門の圚り方」に぀いお語りたす。

  • 日時9月5日朚 16:30 〜 16:55
  • 登壇者平内矩圊
  • 詳现

プリンセスコネクトRe:Dive運甚事䟋 リリヌスの高頻床化ず安定化を䞡立させるプリコネRの運甚䜓制

高頻床の曎新を考慮したアプリ蚭蚈や、CIを甚いた倧量に存圚するリ゜ヌスファむル・開発環境・ブランチ管理コスト改善などの取り組みを玹介する講挔です。『プリンセスコネクトRe:Dive』の運甚においお、いかにしお極力メンテナンスに入らないようにし぀぀、むベント等のリリヌスにおいお倧量のファむル・環境の曎新を実珟しおいったかをお話ししたす。

  • 日時9月6日金 11:20 〜 12:20
  • 登壇者冚田康之
  • 詳现

AAAタむトル開発における、ハむ゚ンドオヌディオ制䜜技術の研究成果ず取り組み事䟋

ワヌルドワむドに向けたAAAタむトルに必芁なゲヌムオヌディオ制䜜技術に぀いお、Cygamesでの研究成果ず取り組み事䟋を玹介する講挔です。単䞀音源の耇数地点でのIRをサンプル化しお距離枛衰・遮蔜に甚いる手法や、䞖界に発信できる楜曲の制䜜における楜噚収録・TDでの課題ず解決案などに぀いおお䌝えしたす。

  • 日時9月6日金 13:30 〜 14:30
  • 登壇者牧村亮治、安井裕䞀、久保早瑠菜
  • 詳现

プロシヌゞャルゲヌムコンテンツ制䜜ブヌトキャンプ 2019 Part 2 機械孊習

高生産性、高品質性を促進する「プロシヌゞャル法」に関する2コマ連続のセッションの第2郚です。第1郚で玹介したバリ゚ヌション䜜成に続いお、プロシヌゞャル法を甚いた機械孊習モデル生成たでの抂芁、そしおゲヌムコンテンツ制䜜ぞの応甚を玹介したす。

  • 日時9月6日金 14:50 〜 15:50
  • 登壇者岞川貎玀ほか2名
  • 詳现

フォトグラメトリヌずプロシヌゞャルを甚いた最新ハむ゚ンドゲヌム3DCG背景制䜜手法 ハむ゚ンドゲヌム開発の経隓がない䌚瀟がいかにしおそれらを生み出したか

珟実の颚景ず錯芚するような写実的な背景制䜜をテヌマに、ハむ゚ンドゲヌム制䜜の経隓がない䌚瀟がそれらを実珟可胜にした制䜜手法ずノりハりを玹介するセッションです。フォトグラメトリヌずプロシヌゞャルの融合、および䌝統的な背景制䜜のノりハりの掻甚に぀いお語りたす。

  • 日時9月6日金 16:30 〜 17:30
  • 登壇者吉冚盎隆
  • 詳现

以䞊、Cygamesスタッフの登壇セッションの抂芁をお届けしたした。CEDEC終了埌にはセッション登壇者からのフォロヌアップ蚘事も展開する予定ですので、どうぞご期埅ください

↧
↧

【瀟内勉匷䌚】和田卓人氏によるレガシヌコヌド改善ワヌクショップを開催したした

$
0
0

サヌバヌサむド゚ンゞニアサブマネヌゞャヌの厔です。
少し前のこずになりたすが、テスト駆動開発TDDの゚バンゞェリストである和田卓人@t-wadaさんを講垫ずしおお招きし、1日かけおレガシヌコヌド改善ワヌクショップを開催したした。

和田さんには以前にも、瀟内でテスト文化ぞの理解を広めたいずいう意図もあり講挔をお願いし、非垞に奜評だったため、今回はより実践的なワヌクショップを開催するこずにしたした。

私たちが長期にわたっお運甚を続けるゲヌムタむトルは、機胜远加や改善を繰り返し、システムが倧芏暡か぀耇雑になっおしたいたす。開発のスピヌドずプログラム品質の䞡立に圱響するため、これらを改善する取り組みのひず぀ずしお、テストを掻甚しお開発効率を䞊げたいず考えたした。

そしお、今回はより実践的なワヌクショップにするために、Cygamesで実際に運甚しおいるゲヌムタむトルの゜ヌスコヌドを利甚したした。和田さんず打ち合わせを重ね、䞍具合が発生しやすくテスト導入が困難な箇所も遞定し、前半は頭で理解し、埌半は䜓で理解するずいう2郚構成で実斜したした。

圓日の流れ

◟前半頭で理解線
  1.講矩
  2.ゲヌムタむトルの゜ヌスコヌドにテストを曞くラむブコヌディング

◟埌半䜓で理解線
  3.ゲヌムタむトルの゜ヌスコヌドにテストを曞くペアプログラミング
  4.発衚䌚コヌドレビュヌ

1.講矩

最初の講矩では、「どこにテストを曞いおいくか」ずいう狙い目を具䜓的に説明しおいただきたした。 

講矩の様子。みんな真剣に聞き入っおいたした

講矩の様子。みんな真剣に聞き入っおいたした

2.ゲヌムタむトルの゜ヌスコヌドにテストを曞くラむブコヌディング

講矩の埌は、和田さんによるラむブコヌディング圢匏のデモです。プログラム内でもシステムの耇雑化によっお特にバグが出やすい機胜を䜿ったデモなので、実際に起こり埗るシチュ゚ヌションを元にテストコヌドの意矩を確認できたした。

3.ゲヌムタむトルの゜ヌスコヌドにテストを曞くペアプログラミング

続いお埌半です。2人1組になり、和田さんが事前に甚意くださった初玚・䞭玚・䞊玚の課題をクリアしおいきたす。どのペアも䌚話をしながら楜しそうに課題に挑んでいるのが印象的でした。

ペアプログラミングでは、2名の゚ンゞニアが盞補的な関係ずなっおテストを曞きたす

ペアプログラミングでは、2名の゚ンゞニアが盞補的な関係ずなっおテストを曞きたす

4.発衚䌚コヌドレビュヌ

最埌は、課題に察しお効果的なアプロヌチをしおいた2組による発衚です。「どういうこずを考えおこのテストコヌドを曞いたか」ずいう意図を説明し、それに察しお質疑応答をしたり、和田さんからは良い点や改善すべき点を指摘しおいただいたりしたした。レビュヌはかなり盛り䞊がり、予定を30分以䞊オヌバヌしたした。

最埌はコヌドレビュヌ。曞いたテストを客芳的に振り返るこずができたす

最埌はコヌドレビュヌ。曞いたテストを客芳的に振り返るこずができたす

たずめ

埌日、参加者にアンケヌトを取っお勉匷䌚の感想を聞いたずころ、「実際のゲヌムタむトルの゜ヌスコヌドに察するテストの戊略や考え方を埗られたのは良かった」など、ポゞティブな回答が倚く埗られたした。

ゲヌムはその内容が幎々耇雑になる傟向にあり、システムも同様に耇雑になっおきおいたす。
Cygamesでは、ナヌザヌに快適に遊んでいただけるように、䞍具合れロに向けお様々な取り組みを詊しおきたした。その取り組みの䞀぀ずしお、テスト駆動開発も採甚しおきたしたが、これたで苊劎するこずも倚くありたした。

今回は、実践的なワヌクショップを通しお「テストずどう向き合うか」を再認識するこずができたした。テストの導入に苊劎をしおいるず、い぀の間にか、テストを曞くこずが目的にすり替わりがちです。そんな時には、「テスト駆動にこだわるな」「ナニットテストにこだわるな」「最初から党郚やろうずするな」ずいう和田さんのお話を思い出そうず思いたす。

たた、テストは闇雲に曞くのではなく、「最も困っおるずころから曞く」「新機胜開発から曞く」「バグ修正のずころから曞く」ずいう考えを参考にしながら、安心しおシステムの品質向䞊に取り組める環境づくりを掚進しおいく぀もりです。

このようにしお、Cygamesの「最高のコンテンツを䜜る䌚瀟」ずいうビゞョンを䜓珟すべく、テストを最倧限に掻甚しおさらに開発効率を䞊げ、品質の高いゲヌムをナヌザヌに提䟛し続けおいきたいず考えおいたす。

最埌に、ずおも有意矩なワヌクショップにしおくださった和田さん、どうもありがずうございたした

↧

【CEDEC 2019 フォロヌアップ】プリンセスコネクトRe:Dive 運甚事䟋 リリヌスの高頻床化ず安定化を䞡立させるプリコネRの運甚䜓制

$
0
0

皆さたこんにちは。Cygamesでクラむントサむド゚ンゞニアを務めおいる冚田ず申したす。2019幎9月6日金に開催されたCEDEC 2019にお、「プリンセスコネクトRe:Dive 運甚事䟋 リリヌスの高頻床化ず安定化を䞡立させるプリコネRの運甚䜓制」ずいう題名で講挔を行いたした。聎講いただいた方々には改めおお瀌申し䞊げたす。

今回は講挔資料の公開ず、講挔埌にいく぀か質問をいただきたしたので、フォロヌアップずいう圢でご返答させおいただきたす。

資料の公開

圓日の講挔資料は䞋蚘ずなりたす。

Q: アプリバヌゞョンごずにPrefabダりンロヌド専甚のURLを甚意しおいるずのこずでしたが、アプリバヌゞョンの切り替わりによっお党リ゜ヌスの再ダりンロヌドなどは発生しないのですか

A アプリバヌゞョンが倉わっおも党リ゜ヌスの再ダりンロヌドが発生しないよう、ファむル内容に差分がある堎合のみリ゜ヌス再ダりンロヌドが行われる凊理をアプリ偎に組んでありたす。講挔ではスラむド衚瀺の郜合䞊割愛したしたが、アセットバンドル名たで含めたダりンロヌドURLは䞋蚘のようになりたす。

https//priconne/Ver1/assetbundle_a
https//priconne/Ver2/assetbundle_a

「Ver1」「Ver2」郚分はナヌザヌがむンストヌルしおいるアプリのバヌゞョンに応じお倉わるため、結果ダりンロヌドURLも倉わりたす。䞊蚘URLのようにVer1、Ver2にも「assetbundle_a」ずいうリ゜ヌスが存圚しおいた堎合、アプリアップデヌト時にこの「assetbundle_a」リ゜ヌスを再ダりンロヌドするか吊かは、同じ階局に配眮しおいる「resource_filelist」ずいうファむルを基に決めおいたす。

https//priconne/Ver1/resource_filelist
https//priconne/Ver2/resource_filelist

このファむル内には「ファむル名ずファむルハッシュ倀」を組みにした情報がリスト圢匏で保存されおおり、アプリはたずこのファむルをダりンロヌドしおきたす。䞀床もダりンロヌドされおいないファむルの堎合は通垞通りダりンロヌドを行い、既にダりンロヌド枈みのファむルの堎合はファむルハッシュ倀に差分があった堎合のみファむルをダりンロヌドしなおすようにアプリ偎で凊理が組たれおいたす。「既にダりンロヌド枈みか 最埌にダりンロヌドしたファむルのファむルハッシュ倀は䜕か」ずいう情報はアプリ偎のロヌカルストレヌゞに別途保存しお管理しおいたす。

※URLやファむル名は党お架空のものです。

※圓日いただいた質問ぞの回答にお「アプリバヌゞョンが䞊がるずアセットバンドル名も倉わる」ず返答しおしたいたしたが、こちら回答に誀りがありたした、倧倉申し蚳ありたせん。URLアドレス䞊でアプリバヌゞョンが䞊がるず倉わるのは、䞊蚘URLの「Ver1」「Ver2」の郚分だけで、アセットバンドル名は倉わりたせん。

Q: ブランチのマヌゞ䜜業党般は誰がどのように管理を行っおいたすか

A 「リリヌス管理」ずいう専任者を立おおマヌゞ察応をしおいたす。スラむド内では「マヌゞ担圓者」ずいう圢で玹介しおいたすが、実際にはブランチのマヌゞに留たらず、ブランチ運甚に関係するあらゆる䜜業を担圓しおいたす。開発党䜓を俯瞰し、進捗管理を行うのが「リリヌス管理」の䞻な䜜業です。具䜓的には、各皮機胜開発や䞍具合修正のスケゞュヌル管理にはじたり、新芏リリヌス甚のブランチ䜜成、埌続のリリヌス甚ブランチぞの䌝播マヌゞ、stagingチェックでのリ゜ヌスビルドやサヌバヌデプロむ、などが䜜業内容ずしお挙げられたす。今回の講挔でご玹介した様々な自動化・効率化は、実はこの「リリヌス管理」の負荷を枛らすための取り組みも含んでいたす。しかし、むベント開催時などの繁忙期には䜜業負荷が集䞭しやすいポゞションでもあるため、マヌゞ䜜業などを持ち回りで担圓するこずもありたす。


Q. Unityアップデヌト時のアプリ曎新もメンテナンスフリヌで行ったのですか

A はい、スラむドでも玹介しおいるようにPrefabリ゜ヌス、通垞リ゜ヌス、ずもにUnity2017甚、Unity2018甚の2バヌゞョンリ゜ヌスを甚意し、Unityアップデヌト察応を含んだアプリ曎新もメンテナンスフリヌで行いたした。しかし、通垞リ゜ヌス偎も2バヌゞョン存圚する状態での運甚は、倧量のリ゜ヌスがどちらのバヌゞョンにもきちんず過䞍足なく存圚しおいるかマヌゞ挏れ等はないかずいうブランチ管理䞊の問題や、本番環境ぞのリリヌスフロヌの耇雑化など様々な困難が生じるため、こういった2バヌゞョン管理状態は可胜な限り回避する方針を取っおいたす。

以䞊、いただいたご質問ぞの返答ずなりたす。
みなさたのご参考になれば幞いです。

↧

【CEDEC 2019 フォロヌアップ】Shadowverse流開発手法 QAコスト削枛ず堅牢性匷化を実珟するプランナヌによるテスト駆動開発

$
0
0

Cygamesゲヌム゚ンゞニアクラむアントサむドの柎田です。
2019幎9月5日朚に開催されたCEDEC 2019にお、「Shadowverse流開発手法 QAコスト削枛ず堅牢性匷化を実珟するプランナヌによるテスト駆動開発」ずいう講挔を、匊瀟ゲヌム゚ンゞニアクラむアントサむドの鄒ずずもに行いたした。
講挔にご参加いただいた皆様には、改めお埡瀌申し䞊げたす。

本講挔では『Shadowverse』を運甚しおいく䞭で問題ずなったQAコストの増加ず堅牢性の䜎䞋に察しお我々がどのように察応したかを、AI開発、スキル開発に分けお解説させおいただきたした。
ここではフォロヌアップずしお、講挔埌にいただいた質問に返答したいず思いたす。

Qテストケヌス再生時は改めおAIの凊理を呌び出すのか

Aそうです。AIがプレむした結果が正解盀面ず䞀臎しないこずは想定した動きを実珟できないこずを意味するので、NGずしたす。䞀郚のスキル付䞎や盀面再珟のために非AI偎の行動も行いたすが、その堎合はスタヌト盀面ず䞀緒に手順も蚘録しお再生したす。

Q耇数の正解がある堎合はどうやっおテストシナリオを䜜るのか

A基本的に1぀のテストケヌスに正解は1぀しかありたせん。耇数の正解があるずいうこずは、耇数の性質の異なる行動プランを立おられるこずになり、そのケヌスに含たれる戊術が1぀だけではないずいうこずになりたす。その堎合、芁件をさらに切り分けられるかをプランナヌず䞀緒に考えたす。

Qテストのための芁玠切り出しが難しいのではないか

Aおそらく゚ンゞニアだけでは非垞に難しいです。テストシナリオず同様に、AIずスキルのどちらにおいおも実装段階から゚ンゞニアずプランナヌで協力をしお各構成芁玠を现かく算出し、それらを䜿甚したテストの仕組みの䜜成や実装を行っおいく必芁があるかず思いたす。

QAIを搭茉しおいないゲヌムの堎合自動テストのためにAIを䜜るこずになるず思うが、やるだけの䟡倀はあるか

Aやる䟡倀は非垞に高いず思いたす。運甚が長くなっおきたずきやプロゞェクトが倧芏暡化しおきたずきなどに、䜕か修正や実装を加える際に゚ンゞニアの心の䜙裕も生たれたすし、圱響範囲が広い修正や実装だったりするず、どうしおも人力ではチェックが远い぀かないずころが出おくるので、そのサポヌトをする意味でもやったほうが良いです。
たた、AIに関しおは賢いものである必芁はありたせん、最䜎限オヌトでバトルを実行できお、法則性を持った動きをしなければ十分テスト甚ずしおは機胜するず思いたす。

以䞊、講挔埌に頂いたご質問ぞのご返答になりたす。
皆さんのご参考になれば幞いです。

↧
Viewing all 78 articles
Browse latest View live