HITACHI 日立 イグニッションコイル 5.5J ポルテ 1300cc NNP10 コラゾン】レガシィワゴン 2NZFE 品番U13T01-COIL 4個

こんにちは、QualiArts 技術開発室 エンジニアリーダーの石黒です。

8月末のCEDEC 2017にて、「複雑化するAssetBundleの配信からロードまでを基盤化した話」というセッションを講演させていただきました。講演自体は弊社の福永と二人で発表しました。当日は満席に近い状態まで埋まり、貴重な時間を割いて本講演にご参加いただけた皆様には御礼申し上げるとともに、自分自身初のCEDEC発表として大変嬉しい限りです。

本エントリーは当日の講演内容をフォローする形なので、当日のスライド↓とあわせてご覧いただけると幸いです。

ゴール

QualiArtsでは2013年頃よりUnityを用いたゲームを多くリリースしてきましたが、当時よりAssetBundleと呼ばれる、Unity用のアセット動的配信機能を使ってきました。そこで本公演では、

  • 今までQualiArtsがAssetBundleでどんな苦労をしてきたか
  • どうしてAssetBundle配信基盤を作ったのか
  • 設計・実装の背景と詳細

をご紹介しました。

あくまで弊社での解決の方向性ということを 【BE エディックス ノブレッセ】Edix MC前 無限バンパー専用 楕円タイコ 片側1本出しマフラー タイプ8テール (中間タイコ無) オールステン/2WD/2400cc、留意していただければと思います。

経緯

元々2015年頃まで開発していたゲームでは 送料無料 245/40R20インチ サマータイヤ ホイール 4本セット HANKOOK VentusV12evo2 ハンコック K120 シュティッヒ レグザス フォーブス ハイパーシルバー/ポリッシュ 8.5J 5H114、AssetBundleに関する機能は個別に開発していました。もちろん各ゲームで完全に個別開発していたわけではなく、ある程度のコード資産の共有は行っていましたが、AssetBundleに対する各種ノウハウなどが分散していたのが実情でした。

そこで基盤を作ることで、以下を目指しました。

  • ノウハウの集中
  • 開発リソースの集中
  • 配信にかかるインフラコストの適正化
  • 実装品質の担保

2015年秋頃より基盤化プロジェクト「OCTO」が始動し、2016年夏にリリースされた「オルタナティブガールズ」に初めて採用されました。以後、全てのアプリにて「OCTO」が利用されています。

サーバー設計・実装

主にセッション中には触れなかった内容について紹介します。

言語

まず、APIサーバー、管理画面、そしてCLIの全てがGolangを採用しています。

採用理由は、

  • シンプルな言語仕様
  • コンパイルが速い
  • デプロイが容易:単一ファイルを配布するだけなので、コンテナと相性が良い
  • クロスコンパイル:様々なプラットフォーム用のCLIを簡単にビルドできる

癖はありますが、基盤に適した良い言語だと思います。実際に他の基盤にもGolangは採用されています。

データベース

データベースに関しては、実績とノウハウのあるMySQLを採用しています。更新するのが開発者側のみで、ユーザーからは参照しかないため、弱めのマスターと強めのスレーブを並べるような形になっています。またコンテナなどは使わずに、普通にインスタンスを立てて使っています。

通信プロトコル

クライアントとの通信プロトコルは、Protocol Buffersを採用しています。これはシリアライズ・デシリアライズともに高速であることが大きな理由です。スキーマを事前に定義する必要はありますが、基盤の性質上大きな変更があることはほとんどなく、現にリリース以降でスキーマは変更していません。また既に他のGolangを採用した基盤でもProtocol Buffersの採用実績があったことも理由の1つです。

CLI

時間の都合上詳しくは紹介できなかったのですが、CLIは以下の機能があります。

  • アップロード
  • タグ追加
  • 削除
  • Copy
  • Sync
  • 存在確認
  • リスト取得

(一部機能は管理画面やゲームサーバーからも使えるようにAPIでも提供しています。)

クライアント設計・実装

こちらも主にセッション中に触れなかった内容について紹介します。

C言語?

講演中では説明しませんでしたが、過去に他の基盤を作る際にC/C++実装のライブラリを採用することで、パフォーマンスとマルチプラットフォーム対応の両方を実現したことがありました。

確かに目的は達成することができたのですが、実際には各プラットフォーム用にビルドする環境を維持するのが大変難しく、またC/C++を扱える人間も少ないため、メンテナンスコストが非常に高かったです。そのためOCTOを作る際にも当初C/C++でなるべく実装するという話もありましたが、オールC#を目指して開発することにしました。

UnityWebRequestの秘話

また、講演当日は、UnityWebRequestでスムーズに検証を進めたかの如く喋っていましたが、実際にはリリースまでにいろいろなトライ&エラーを繰り返しました。それは当時使っていた(今でも使っている)Unity 5.3系ではまだiOS/Androidサポートがexperimentalな位置づけだったためです。普通にGETで通信するだけでも、クラッシュしてしまったり、挙動がおかしいことが多々ありました。

そのため、Unity 5.3系の初期の方では、ひたすらUnityWebRequestのバグをUnity側にレポートしていました。そのかいあってか、後半の方にはおおよそ致命的なバグは直っていたため EXCLUSIVE ZEUS フリード GB3/4 グレード:Gジャストセレクション/G 後期 (2014/4-) GLACE LINE フロントハーフスポイラー 塗装済 ホワイトオーキッドパール (NH788P)、なんとかサービスのリリースに間に合わせることができました。

ただ、UnityWebRequest自体のバグは2017年9月現在でも散見するような状況ですので、バグが一切ないわけではないということに注意する必要があります。

独自キャッシュ管理周りのバグ祭り

バグ関連でもう一つ、独自キャッシュ管理においてキャッシュ走査を別スレッドで行っていることを説明しましたが、実はこれに関連したバグがリリース以降も散発してしまいました。(これに関してはユーザーさんからのお問い合わせで発覚することが多く、大変申し訳無い気持ちでいっぱいでした。)それはマルチスレッドが故に、なかなか発生しないレアなバグが潜在的に多かったからです。

もちろん排他制御は行っているのですが、大きい単位で排他制御をすると最悪ゲームが動いているメインスレッドが止まってしまう可能性があるため、必要以上に大きい単位でロックしないようにしたり、ロックに使うmutexを細かく使い分けて、パフォーマンスに配慮していましたが、逆にこれがバグの温床になってしまいました。

結果的には、リリースして半年以上経ってもマルチスレッド起因のバグが潰しきれていない状態でしたが、ここ最近は不具合を聞いていないので一年越しでようやく仕上がったと思います。

反省としては 、キャッシュモジュール周りのエイジングテストをしっかり行う、実機を想定して低速なI/O環境を擬似的に再現できるようにsleepを入れるなどが考えられます。

ストイックなAssetBundleのメモリ管理

講演中の説明では、AssetBundleを参照しているGameObjectがある限りはアンロードしないと説明しましたが、実はこの方式の場合はAssetBundleを同時に使う数が増えれば増えるほどメモリを圧迫してしまう原因になってしまいます。AssetBundleが必要なのはAssetのロードが完了するまでで テールライト 1999-2016 Ford F250 F350 F450 F550 Super Duty LED 3rd Brake Light Tail Stop Lamp 1999?2016フォードF250 F350 F450 F550スーパーデューティLED第3ブレーキライトテールストップランプ、Assetが完了したらそのAssetBundleはアンロードしても良いはずです。

そこでOCTOではデフォルトメモリリーク回避のために、AssetBundle.UnloadのunloadAllLoadedObjects引き数をtrueにしているところを、ストイックな管理もできるように、オプションの切り替えでAssetBundleをアンロードしてもロードしたアセットをアンロードしないようにもできるようになっています。

まとめ

AssetBundle配信基盤の目的としては、基盤化による工数削減と品質担保がメインでした。そのためスケールメリットを活かせるような規模でないと基盤化は難しいかもしれません。ですがAssetBundle周りはユーザ体験に直結するため、AssetBundleを扱う全ての人に何かしらのヒントになれば嬉しい限りです。そして最終的に、

HITACHI 日立 イグニッションコイル ポルテ 1300cc NNP10 2NZFE 品番U13T01-COIL 4個新作も続々入荷!


カーマット フロアマット ダイハツ ウェイク 26年11~ -ECOマルーン


HITACHI 日立 イグニッションコイル ポルテ 1300cc NNP10 2NZFE 品番U13T01-COIL 4個 ダイハツ ミラ L700(H10.09~)全車共通用カスタムオーダーフロアマット【AWESOME/オーサム】05P05Nov16

↓↓↓MIKA Metals ミカメタルズ Hybrid シリーズハンドルバー(7/8ベース大径バー) バーパッドカラー:ブラック ベンドタイプ:YZ BEND/REED;SHIFTUP(シフトアップ)APE/XR PD145cc 57mm鍛造ピストン キット[405115-PK];DOTTY BENZ Aクラス W168 シートカバー COX リヤ6:4分割 ヘッドレストドーナツ形タイプ, RSR Ti2000 スーパーダウンサス リアのみ MRワゴン MF21S 14/6~16/1 FF 660 TB スポーツ, ヨシムラ BAZZAZ Z-FI MX 10-RMZ250F BZ-F630 JP店, 19インチ サマータイヤ セット【ウィッシュ(20系 Sグレード)】MID RMP 028F ハイパーメタルコート/ミラーカット 7.5Jx19ディレッツァ DZ102 225/35R19, DUNLOP ダンロップ エナセーブ RV504 ENASAVE ミニバン サマータイヤ 195/65R15 HotStuff 軽量設計! G-SPEED G-04 ブラック ホイールセット 4本 15インチ 15 X 6 +53 5穴 114.3;【店舗取付サービス】【CT/CV ワゴンR ダムド】CT/CV WAGON R DTM typeA リアバンパー(かぶせタイプ) 【エクスクルージブ ゼウス】セレナ 【 GRACE LINE 】 エキゾーストシステム 左右4本出し 左右4本出し(2WD) SERENA (C26) Highway STAR MC前 2010/11 - 2013/11↓↓↓【店舗取付サービス】★送料無料★(一部離島等除く) 【エルエックスモード】LXマークレスフロントグリル(LEXUS(レクサス) GS(190系05.08-07.09)) ガンメタリック, YOKOHAMA ヨコハマ ice GUARD6 アイスガード ig60 スタッドレス スタッドレスタイヤ 165/70R14 MONZA JP STYLE CRAVER ホイールセット 4本 14 X 5.5 +40 4穴 100, 215/55R17 サマータイヤ タイヤホイールセット 【送料無料】HRS H-498 17x7.0 +45 100x5 BKS-FP + NEXTRY (215-55-17 215/55/17 215 55 17)夏タイヤ 17インチ 4本セット 新品, レヴォーグ VMG フロントリップスポイラー 塗装済 ガレージベリー, 【★送料無料】 【BK アクセラ オートエクゼ】ホイ-ルナットセット(全車)

【T244】エスティマ [H15/5-H17/12][ACR30W / ACR40W / MCR30W / MCR40W] セレクション ブラック Bellezza ベレッツァ シートカバー

↓↓↓↓↓↓


↓↓↓↓↓↓↓↓↓↓↓↓

ミシュラン Pilot Sport Cup2 サマータイヤ 215/45R17 BLEST Bahnsport Type504 ホイールセット 4本 17インチ 17 X 7 +42 4穴 100, 「複数種類あり」 フロント ウインド の グラス ■ 『図の略番 65010 のみ』 スバル純正部品 エクシーガ 適合年式[平成20年04月~next]『品番』 65009YC010 ^j68^, 165/50R16 BRIDGESTONE ブリヂストン Playz PX-C プレイズ PX-C GARSON GLAIVE ギャルソン グレイブ サマータイヤホイール4本セット, KYB(カヤバ) ショックアブソーバー+スプリング ローファースポーツキット トヨタ ノア AZR60G 01/11- 品番:LKIT-AZR61G, ブリヂストン BRIDGESTONE レグノ REGNO GR-XI 225/40R18 255/35R18 18インチ スポーツ系 サマー タイヤ ホイール セット 夏用 SSR GTX03 18×7.5J+48 18×8.5J+50 5/100

【店舗取付サービス】【★送料無料】 【20 アルファード アーティシャンスピリッツ】アルファード ANH 20/25W 後期 Sグレード HIGH-SPEC LINE VERSE マフラー リアピース デュアル左右出し;18インチヴァンガード30系 240SENKEI パフォーマンスライン PF07 ダークシルバー 7.5Jx18グラントレック PT3 235/55R18 【★送料無料キャンペーン中】 【D2 レーシングスポーツ】HONDA CIVICEKTWINCAM 96~00 D2 サスペンションキット STREET (Front アルミトップマウント & Rear アルミトップマウント) クスコ CUSCO 強化スタビライザー フロント スズキ スイフトスポーツ ZC33S (MT/AT) 全車適合;(2本セット) 175/80R15 90Q BRIDGESTONE BLIZZAK DM-V2 ブリヂストン ブリザックDM-V2 15インチ 新品2本・正規品 スタッドレスタイヤ SUVタイヤ

エコノミー オーダーメイドオリジナルカーマット 車種専用タイプ スカイライン クーペ/セダン,スカイラインGT-R 選べる5カラー スカイライン3-1;スタッドレスタイヤ ダンロップ ウインターマックス02 WM02 165/55R15 75Q & ジースピード P-02 4.5-15 タイヤホイール4本セット 165/55-15 DUNLOP WINTER MAXX 02 WM02

、全世界のユーザーの方の不満が少しでも減らせることができれば、エンジニア冥利に尽きます。

石黒 祐輔(Yusuke Ishiguro)2014年 サイバーエージェントに入社。AmebaGames(現QualiArts)の基盤にUnityエンジニアとして配属。主に関わった基盤のサービスは、リアルタイム基盤、チャット基盤、AssetBundle管理基盤「Octo」。現在は JIC ラテラルロッド エブリイ DA64W、QualiArtsにて基盤のエンジニアリーダーを担当している。

NNP10 ポルテ イグニッションコイル NNP10 日立 イグニッションコイル 2NZFE 4個 HITACHI 品番U13T01-COIL 1300cc