Happy My Life

日常とか技術とか

ゲームプログラミングの今後

Tim Sweeney, “The end of the GPU roadmap” - HPG2009, PDFより。

CPUやGPUは今後どのように進化していくのだろうか? それをEpicGames(UnrealEngineの開発元)のCEOがHPG2009で発表している。それが上記のスライド。

翻訳してみようかとちょっとググってみると、どうもCEDEC 2008で公表している内容と同じのようなので、スライド前半部分のグラフィックス周辺の進化についてはCEDEC 2008 - EPIC GAMESのTIM SWEENEYが語る「10年後のゲーム機の姿、ソフトウェアの形」(後編) (2) REYESレンダリングのリアルタイム実装が実現するかを見てもらうとして。

このスライドの後半ではソフトウェアの方向性についての予測も書かれている。これは、先程のCEDEC 2008 - EPIC GAMESのTIM SWEENEYが語る「10年後のゲーム機の姿、ソフトウェアの形」(後編) (2) REYESレンダリングのリアルタイム実装が実現するかでは、ほとんど触れられていないので、こちらを中心に紹介してみる。

ゲームソフトウェアの将来

スレッド

今時のゲームアプリケーションは、10?100のスレッドが動いている。

UnrealEngineではこれらのスレッドが平行して動作している。

  • ゲームスレッド。AIやオブジェクトの制御
  • レンダリングスレッド。画像生成など
  • その他、ヘルパースレッド。物理演算など

スレッドなんて4つで十分。100スレッドなんて必要無いよと。

現在のゲームプログラミング環境は

  • 多くのスレッドが走っている
  • (今どき)512MBのデータ領域
  • それぞれのスレッドでいつでもデータが変更できるように
  • 手動によるスレッド間の同期
  • デッドロックの検査なんて、コンパイラはしてくれない

と、あまりプログラマに優しくない環境で構成されている。

その解決方法として提案されているのが、純関数型プログラミングスタイル(Haskell等の純関数型言語を採用するのも手段の一つ)

関数型プログラミングスタイルのメリットとして

  • 共有メモリやI/Oのパフォーマンスなどを意識せずにロジックが書ける。当たり判定、物理演算、シェーディングなど。
  • マルチスレッドが(デッドロック等の心配をせず)安全に書く事ができる
  • 未来のコンパイラは、自動的にマルチスレッド化してくれるかも

など。

メモリのトランザクション処理

複数のスレッドから同一のメモリを参照するので、メモリのトランザクション処理が必要となってくる。

問題点として、

  • C++ランタイムのサポート
  • 大きなオーバーヘッドが発生する

などが挙げられている

ベクタライゼーション(Vectorization)

ベクター命令のサポートが今後のゲームプログラミングに影響してくる。今のCPUもSSEなどベクター命令はサポートされているが、GeForce8シリーズ等で採用されているベクター命令は、もっと便利で凄いよ、と。

新しいベクター命令が、どう便利で凄いか?

  • 今までより制約が少ない。コードを命令に合せて書き換える必要がない。
  • C言語の拡張版のように書く事ができる(ベクター命令を意識しなくていい)

今までこう書いていたコードが

int n;
cmplx coords[];
int color[] = new int[n]
for(int i=0; i<n; i++) {
  int j=0;
  cmplx c=cmplx(0,0)
  while(mag(c) < 2) {
    c=c*c + coords[i];
    j++;
  }
  color[i] = j;
}

以下のように書ける。

cmplx coords[];
intcolor[] = new int[n]
for(int i=0; i<n; i+=N) {
  int[N] i_vector={i,i+1,..i+N-1}
  bool[N] i_mask={i<n,i+1<n,i+2<n,..i+N-1<n}
  complx[N] c_vector={cmplx(0,0),..}
  while(1) {
    bool[N] while_vector={
      i_mask[0] && mag(c_vector[0])<2,
      ..
    }
    if(all_false(while_vector))
      break;
    c_vector=c_vector*c_vector+ coords[i..i+N-1 : i_mask];
  }
  colors[i..i+N-1 : i_mask] = c_vector;
}

ほとんどC言語ベクター命令を操作している雰囲気を感じさせない。

ゲームプログラミングの今後

今後のゲームプログラミングは、

というの流れになりそうだ。純関数型言語は、今のメニーコアなアーキテクチャを手間を増やさず効率よくコーディングするには必然の流れとも思える。ベクター命令の更なる活用にしても、レンダリングの差別化=ゲームそのものの差別化という意味でも必然の流れかと思う。

一般アプリケーション開発も、将来的には同じ流れになると思う。特に純関数型プログラミングに関しては、CPUのメニーコア化が進んでいる今、ある意味必然ではないだろうか。