投稿者 tel | 2014年6月26日

スクウェア・エニックスモバイルオープンカンファレンス

スクウェア・エニックスモバイルオープンカンファレンスに行ってきた。

大変人気だったみたいで午前の部、午後の部あっという間にチケットが売り切れてた。

セッション内容のメモ。

cocos2d-xの最新状況

内製SGエンジンの軌跡 ~クライアント編~

スクールガールストライカーズで使われているゲームエンジンの紹介。

エンジンの紹介

  • 軽い iOS 3.5mb android 350KB
  • 起動が早い
  • 継続率が高まる
  • OPデモ実行中にリソースダウンロード
  • 3D描画について
    1体6000ポリゴン 60fps 同時に5体
    iphone4s基準
  • 目のパーツをリアルタイムに合成
    表情が豊かに
  • 目線、首の角度を制御
  • 髪揺れをリアルタイムに計算
  • OpenGL ES 2.0、C++
  • windowsでも動作
  • コンバータはpython
  • JenkinsでCI
  • ソース Mercurius リソース SVN
  • スクリプト squirrel
  • フルスクラッチ開発
  • ゲームは3人のプログラマ 2人がサーバと兼任

メタプログラミング

  • エンジンは1人で作っている
  • 設計を入力するとソースコードを出力
  • 関数オーバーロードでsetter getterを区別
  • jqueryみたいにメソッドチェーン
  • 関数定義 などの仕様をYAMLで記述
    型、名前、引数、etc
  • pythonで処理
  • squirrelへのバインド関数生成(.cpp)
  • ドキュメント、引数チェック、遅延評価コード、計測コード、→ 自動生成
  • 修正が楽
  • プログラミングを半自動化

CPUキャッシュについて

  • メインメモリは遅い
  • プログラムが大きくなればキャッシュにヒットしなくなる
  • 常駐コード600kB
  • コードサイズを小さく
  • 美しいコードは自然にシンプルにある
  • ループを小さく
  • 積極的なinline展開
    インライン化したほうがサイズが小さくなって速度が早くなる場合も

リソースロードの仕組み

  • ディスクデバイス時代、某携帯ゲームはシーク時間が遅くて泣かされた
  • スマートフォンはメモリデバイス
    ディスクに比べたら速いが、もっと速くする
  • OSのファイルシステム
    1アクセス512バイト発生する
  • アクセス回数をとにかく減らす
  • はじめはsqliteを使ってみた
    楽ではある
    プログラムのサイズが500KBも増えてしまった
  • 自前で作った
  • 起動した時にパッチをダウンロードして更新
  • 1万2千リソース
  • 31bitのハッシュidを設定
  • 240MBの1本のリソース
  • id順でソート済み
  • idを与えてバイナリサーチ
  • 一発シーク一発リード
  • 先読み、メモリキャッシュも実装

セキュリティーのお話 ~安全なゲームを作るために~ サーバ編

  • セキュリティは基本の積み重ね
  • 負け=プログラマのミス
  • プログラマのミスを防ぐに特化し単純化
  • 問題にいつ気づくか
    コンパイル時エラーはPHPではむずかしい
  • 盾なしだと動かないようにする
  • 玄関を一つにして攻撃は入り口で防ぐ
  • 通信内容を入り口で検査すれば大抵の攻撃は防げる
  • PHPの弱点をついた攻撃
  • 整数を想定していたのに… 少数、文字列、壊れた文字列
  • MySQL+PHPの弱点ネタ
  • 自前で厳密にやるしかない
  • 対策は最初から。あとからは無理
  • 怪しい場合は安全側に倒す

内製SGエンジンの軌跡 サーバ編

なぜ内製?

  • ソーシャルゲームの品質が安定しない
  • スキルが外部開発会社に依存ししまう
  • 技術ノウハウが残らない

既存のPHPのフレームワークなぜ使わなかった?

  • ブラックボックス化を避ける
  • ミニマム実装

環境

  • PHP 5.5
  • MySQL 5.6
  • kvs memcached, apcu

枯れたものしか使っていない

  • R&Dが目的でない
  • 横展開しやすさ

バグは続くよどこまでも いかにしてバグと戦うか

バグを減らすために

  • コーディングによって紛れ込む。日頃からバグを発見できる環境を整える
  • 静的解析の導入
    FindBug, cppcheck, Clang(Xcode)
  • ユニットテストの導入
    CppUnit
    JUnit
    C++Test
    描画関連には不向き
  • コードレビューの導入
    バグ混入を防止
    コード設計の確認
    脆弱性の発見
    パf-マンス低下の防止
    エンジニア成熟度の確認
  • 自動動作テストの導入
    シナリオに従ってアプリを自動再生
    基本動作確認(そもそも動作する?)

バグを見つけるために

  • 想定外の値は例外かアサート
  • QA時はあえてクラッシュさせてレポートを得る
  • メモリグラフを表示
    メモリリークの発見
    メモリの大量消費のタイミングを把握
  • 解放したメモリを参照してしまうバグ
    メモリアロケータを独自実装
    freeした領域をフィル

バグを追うために

  • バグがユーザに与えている影響をリアルタイムに把握できる仕組みを準備しておく
  • SmartBeat

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

インフラ周りは自分の知識が乏しくてあんまりメモ取れてない。

セッション後に座談会みたいな感じで質問とかができた。人数制限が50人くらいだったのはこのためかな?小グループで登壇者と話せ、質問しやすいのでなかなかよかった。

ペンを忘れてアンケートが書けなかったので筆記用具をちゃんと持って行こう。


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。