Archive for 9月, 2009

期間が空いたけど、2日目は下記に参加してきました。

・慣れたら死ぬぞ
・Crytek社ゲームグラフィックスの将来に向けて!Future of Gaming Graphics
・スケーラブルな並列化
・最新モバイル3Dグラフィックスプログラミング入門
・モバイルゲーム・パネルトーク 〜 その無限の可能性を体感する60分 〜

まぁ、そこまで興奮する話は無かったんだよね。
だいたいこんな感じの話。

・慣れたら死ぬぞ
富野氏はゲームが大嫌い。ゲームなんていらない。くやしかったら俺を黙らせてみろ。
などツンツンとした挑戦的な話で始まって、途中でちょっとデレて、最後にまたツンツンしていた。

・Crytek社ゲームグラフィックスの将来に向けて!Future of Gaming Graphics

CryEngineの紹介
プロシージャルおいしいよ、ゲームグラフィクスの次の変化は2012年頃じゃないかな?

・スケーラブルな並列化
並列化っていろいろあるけど、VisualStudio使えばほら簡単に並列化できるよ

・最新モバイル3Dグラフィックスプログラミング入門
OpenGL ES 2.0 はすごいけど、下位の機種を考えると OpenGL ES 1.0 で頑張らないといけない

・モバイルゲーム・パネルトーク 〜 その無限の可能性を体感する60分 〜

Android マーケットは Apple ストアみたいなもんだよ。野良アプリもOKだよ
 
 
モバイル3Dグラフィクスの話は、結構面白かった。最近は携帯でこれだけポリゴン表示できるのね。
OpenGL ES 2.0 になってしまうけど、シェーダも使えるしね。

CEDEC の話でも。
参加したセッションは下記。

・情報技術はどこへ行くのか?−主役は交代している−
・MMOゲームサーバープログラミングの実際
・バグを限りなくゼロにする方法
・ソウルキャリバーシリーズ、ビジュアルプログラミングについて
・P2P通信技術: BitTorrentプロトコルを用いた大容量データ配信
・Android Marketで配信するアプリ開発するコツ

MMO と P2P が面白かったので、その話を紹介。

MMO
MMOゲームサーバプログラミングにおけるボトルネックはデータベース。
データベースの速度、ボトルネック等を考慮した上でのサーバプログラムの実装について紹介。
クライアントがゲームなので、DBに書き込み、読み込みをしてゲームを遅延させる分けにはいかない。
DB処理は非同期で行う必要がある。
これを解決するためには、クライアントとDBの間に非同期化サーバを入れてやる。
このサーバが一元化、非同期化を行い、DB処理を順次行う。
どこかのタイミングでクライアントに結果をコールバックする。

WEBアプリケーションはDB操作がボトルネックになりやすいのを、非同期化処理によってクライアントには影響ないようにした例。
このような実装をしているメーカーは多いとも言っていた。

P2P
KONAMIのメタルギアソリッドのアップデートパッチ配布を例に紹介された話。
パッチの配布は、公開開始の時機にアクセスが集中しやすい。ピークに合わせて配信サーバを用意するのは高コスト。
CDNやISPキャッシュを利用することでもアクセスの集中に対応できるが、やはり高コスト。

そこで P2P(BitTorrent) の利用を選択。選択した理由は下記。
・配信管理可能
・匿名性なし
・技術的にこなれている
・商用あり

結果として統計で下記を実現
・70%以上のオフロード率を達成
・非常に小さく、安定したトラフィック

今後の課題
・メモリ不足によって接続数が少ない
・ADSL の昇りが遅い(北米、欧州ではADSLが主流)
・ネットワーク距離が長いと遅い
・ISP制限のかかったピアの存在
・NAT越えが困難

非常に面白い話題であった。このP2Pによるパッチ配布は PS3 と PCで実際に行われたらしい。
コンソールゲームに P2P を利用してパッチ配布というと企業は嫌がりそうなものなのに。
結果としてトラフィック分散と費用の削減ができたので、今後はこのような手法が増えて行くかもしれない。

自動整形機能のイライラを軽減するGoogle Syntax Highlighterプラグイン

どんな感じになるだろう。
ログ周りを追加してたコードの破片をぺたり。

#ifdef USE_DIRECTX8
    typedef D3DCAPS8 D3DCAPSX;
#endif

#ifdef USE_DIRECTX9
    typedef D3DCAPS9 D3DCAPSX;
#endif

#ifdef USE_DIRECTX10 // 今のところ未使用
    typedef D3DCAPS10 D3DCAPSX;
#endif

    D3DCAPSX caps;
    ZeroMemory(&caps, sizeof(D3DCAPSX));
    pDevice_->GetDeviceCaps(&caps);

    struct local {
        static const TCHAR* check(const bool v) {
            return v ? _T("○") : _T("×");
        }
    };

    typedef boost::format format;
    typedef TreeLogger logger;

    logger root("D3DCAPS", ofs, true);

おぉ、結構いい感じ!!