今日はネットでゲームのプレイ動画をみたりキャプチャしたりして
資料集めをしながら、制作用のラフを描いたりしてました。
キャラクターはデザインを決めるのがすごく難しいですね。
そういえば、息抜きに今までよく分からなかったCUDAについて
調べてみたのですが、実はこいつ、GPUとCPUを並列プログラミングさせる
言語だということが分かりました。おおー。
え?よく分からないって?
僕も今までよく理解していなかったので、あまり説明できないのですが。
以下、いつもより少し長めに説明します。
まずはじめに、DirectXやOPENGLのような3DグラフィックスAPIは通常、
座標変換やラスタライズといった処理はCPUだと重たいので
GPUによってそれらを処理させております。
GPUはCPUと違い頂点やピクセルの計算を1つづつではなく並列して
一気にまとめて計算できるように作られているので、CPUよりも
かなり高速に処理できるわけです。
が、しかし。このCPU-GPU転送間には問題もあるのです。
まず第一にCPUからGPUのデータにアクセスしたり、
メインメモリのデータをGPUに転送したりといった処理自体が
重いという問題があります。いままで何回かこの問題で四苦八苦したので
結構この辺は分かりやすいですね。
それ以外に今回発見した問題。それは…。
GPUにデータを転送した後は、実はCPU側では何も処理を
せずにじっとしていたということです!まあ考えたら、そりゃそうですよ。
あるオブジェクトをGPUが描画計算している最中に、
CPUから「これお願いしますねー」っていわれて、次から次へと
命令を送られても、どうしようもないので。
じゃあ別にCPU側で何もしてない方がいいじゃないかと思うかもしれないですが
案外そうでもないんです。例えば、ゲームでは当たり前のように
当たり判定処理を必要としますが、これを毎回描画計算の
前もしくは後に行っていると、それなりに処理が重いんですよ。
けど、当たり判定に必要なフレームの座標値はオフセット行列から
あらかじめ取得できるので、GPUに転送する前のデータだけで
当たり判定が出来ちゃうのです。つまり、この処理をCUDAを使って
GPU計算時にCPU側で処理させることで結構高速になると。そういうことです。
それじゃさっそくCUDAをインストールしてみようと思ったのですが…。
仕様書をみてみると、僕のビデオカードが対応していない!!
GeForce8000系以上にしか対応してないようです。ががーん。
さらに付け加えると、nVidiaの自社のビデオカードに
最適化するように設計されているので、他の会社のビデオカードだと
利用できないという苦笑。
けど、OPENCLというAPIならCUDAと違ってマルチな設計に
してあるみたいです。まあ最適化されていない分、若干遅いようですが、
これならいいなと思ってネットで調べてみても。
…ほとんど情報が無いじゃないか。。おまけにOPENGLには
標準対応させているにも関わらず、DirectXには対応していないという。
DirectXはMicrosoft側が自社で設計を考察してるようですが、うーん。
結局、CPU-GPU間の並列プログラミングはここ2~3年にようやく
普及しはじめた技術のようなので。まだまだ発展段階のようです。
なので、まだ今の制作に生かすには早いように感じましたが、
最新の3D事情が少し位は理解できるようになったかなと、そう思いました。
それでふと思ったんですが。
わざわざそんなAPIを使わなくても普通にマルチスレッドプログラムを組んで
GPU転送前にスレッドを分けることでそれなりに速度向上できるのかなと
思ったんですが。どうなんですかね。
てか、CPUで頂点計算させる分、GPUの負荷が軽くなるなんて
今までほざいとりましたが(僕の本にそう書いてあったんですけどね)、
実際のところCPUで頂点計算させるメリットが全く無いね笑。
とりあえずシェーダで頂点計算させてみようかな。