Instantly share code, notes, and snippets.

Embed
What would you like to do?
スクエニモバイルカンファレンスに行ってきたまとめ

スクエニモバイルカンファレンス

※メモなのでタイプミスとか間違ってるとことかよくわからないところもある

cocos2d-x最新事情

v3.xの魅力 スライドは後日調整できたら公開

  • C++11

  • callbackをstd::functionに

  • 基底クラスCCObjectの削除

    • Ref, Clonable
  • レンダラが書きなおされて速くなった

    • SceneGraphからきりhなし
    • 2.x はSceneGraph解析時にGLESのAPIがコールされてCPUブロックがかかってしまっていた
    • 3.x からCommandQueueを使う
  • AutoBatching

    • 2.x系はBatchNodeを作る必要があった
    • 3.xからはCommandQueueに積まれていて、同じマテリアル、同じZ値であればどローコールが1
  • AutoCulling

    • ようやく、今までなかったのが不思議
  • Labelの使い勝手の向上

    • Glow, Shadowなど
  • 3D対応

    • 3.1から
    • 2x3マトリックスかr4x4マトリックスへ
    • Sprite3d
  • コマンドラインツール

    • こんぱいるからでぷろいまでぜんぶコマンドからできる
    • cocos compile -p ios
    • cocos run -p ios
      • iOSだとしみゅ
      • Androidだとapk
  • LGPLライセンスコードが入っている

    • リバースエンジニアリングを許可するライセンスが...
    • デフォルトのソースに入っている
    • スクエニでLLVMライセンスになるようにリライトしてぷるり
    • オープンソースをチェックする部門がある
    • pullrequest 6643, 6634

スクストの内製エンジンの話

クライアント

エンジンが超軽量

  • ダウンロード早い起動早い電池もちいい
    • 継続率が高まる
  • スマホで3dやりたかった
  • 2d並みのコストで
  • キャラは一体6000ポリゴン
  • 60fps
  • 目のリアルタイム合成
  • ぶつりモーションをリアルタイム合成

jenkins

mercurial(プログラム)/subversion(リソース)

スクリプト言語squirrelを使用

フルスクラッチ

メタプロ

  • メタプログラミングといえるかは微妙
  • 設計を入力するとC++プログラムを出すプログラムを作成
  • 関数定義をyamlで
  • pythonでyamlを解析
  • いろいろすべて自動生成
  • ルールから外れる設計が存在できない
  • 処理速度と生産性と安全性を確保できた

CPUキャッシュ

  • 600kbyteなのでl2キャッシュに全部入る
  • 64バイト未満のループは更に早い

リソースロードの仕組み

  • メモリデバイスなので高速、設計が楽
  • OSは1アクセスで最低でも512byte->アクセス回数を減らす
  • はじめはsqliteおつかっていた
  • 更新は楽だけど遅い
  • 起動した時にサーバからダウンロード
  • 1万2000のリソース全てに31byteのid
  • リソースをファイル一本にしt常時常駐
  • 参照用の配列をめもりにもっておく

拡張して他のタイトルでも使っていきたい

サーバサイド

セキュリティの話

基本の積み重ね
基本に忠実に作って「負けなければ勝ち」

負け=プログラムのミス

  • プログラマのミスを防ぐフレームワーク設計
  • いかに問題に気づきやすくするか、直しやすくするか

PHP製

セキュリティの盾がないと動かないようにする
玄関を一つにして一括で対策する

攻撃は入り口で防ぐ
端末側が出来おるのは「異常な通信内容の送信」のみ

  • 整数ほしいのに少数とか
  • 文字コードが壊れてるとか

対策は最初から用意。あとからは無理
怪しい場合は安全側に倒す。通信内容があやしかったら即打ち切り

なぜ内省したのか

  • ソシャゲの品質は安定しない
  • 外部の会社のスキルに依存・ノウハウがのこらない
  • ヨコ展開できる
  • 整備してから外部に提供すれば良い

サーバーフレームワークを内製

  • ブラックボックス化を避けたい
  • ソシャゲ特化のミニマル実装したい

PHP5.5
MySQL5.6
memcached, apcu

超シンプルな設計
革新的なところはない

軽い・作りやすい・セキュリティが硬い
とにかくじつようせい重視

ユーザーデータ管理
特定のDBテーブルに対応したデータを管理するコンポーネント
コンポーネントをキャッシュして二回目以降はDBにアクセスしない
apcu, memcachedどちらに保存するか差し替えられる

コンポーネントを更新してから、アンロック時にDB更新

通信回数を減らす

  • 処理実行APIとデータ取得APIを分けるのは無駄なのでまとめる
  • 差分だけ返却するようにして通信料を抑える

開発サーバを参照してローカルサーバを手軽に構築できるようにしている

クラウド非月額/当月最大DAUを指標にしてタイトル感で比較

ソシャゲ開発にありがちなこと

  • クライアントばかりに目が行きがちで、サーバや運用の問題が露見するのはサービスインしてしばらくしてから
  • とりかえしつかないことも...
  • サーバPGから積極的に提案することで防ぐ
  • メリッとでもリット代案をわかりやすく説明
  • チーム全員がKPIお随時確認

萌えに詳しい人が本気のダメ出しした

いかにしてバグと戦うか

ターゲットはメモリ管理がひつようなC++,Obj-C

バグを減らすために

バグを発見できる開発体制を整える

  • 静的解析の導入(有償・無償)
  • ユニットですとの導入
    • CppUnit
    • C++Test
  • コードレビューの導入
    • Githubでのコードレビュー
      • 設計の確認・脆弱性の発見・成熟度の確認
  • 自動動作テストの導入
    • CIの導入

バグを見つけるために

  • QAチェックを外部委託する場合、Instrumentsとかを使えない
    • アプリに有益な機能をあらかじめ実装
  • 例外とアサート
  • メモリグラフを表示する機能
    • メモリリークの発見
    • 大量消費タイミングを検出
  • ゾンビオブジェクト
    • メモリアロケータを独自実装
    • freeのタイミングでメモリ領域を0xFFでFILL
  • クラッシュレポートの収集
    • iOS8からアプリ独自のログを出力できる

バグを追うために

  • バグをリアルタイムでとれるようにする
    • SnartBeat
      • FROSK株式会社
      • クラッシュ解析ツール

モバイルゲームインフラあるある

  • サーバ追加したらゲームに繋がらなくなった...
    • DNS RRで負荷分散
    • DNS応答が512byte超えた
    • DNS TCPフォールバック
    • ロードバランサーに切り替え
    • proxyタイプだとIPがとれなくなったり帯域超えたり
  • サーバ増やしたらKVSの通信が不安定に
    • memcachedが原因
    • アクセスがかたよるでーたをKVSに入れてた
    • 2Gbpsを超えたりした
    • キーを細工してデータの格納先を分散して解決
    • WEB/APサーバに置く(メリット・デメリットあり)
  • DBを水平分割してスケールするようにした
    • デッドロックが起きた
    • セマフォテーブルを使う
    • 分割した複数DNのロールバックをどう実装するか
    • セマフォテーブルの負荷をどうするか
  • ギルドvsギルドを搭載
    • 人数が多いギルドが重くなる
    • 並列でDBクエリを投げる
    • golangとか
    • どうしてもPHPならギルド処理を別DBへ
  • DBをマスタスレーブで構成したら負荷が高まった時にマスタが壊れていく
    • 遅延が許されないデータをスレーブから読んでいた
    • 遅延が許されないデータはマスタから
  • リアルタイム対戦が流行ったらネットワーク化金がやばい
    • 小さいパケットが大量に飛ぶ
    • パブリッククラウドは通信料課金(帯域ではない)
  • 一台止めたら負荷がやばい
    • セッション切れ再コネクトラッシュ
    • 全ユーザーのオートログインで死ぬ
    • システムダウンの無限コンボが起こる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment