GC付きの言語での大規模開発
http://d.hatena.ne.jp/yaneurao/20040410#p1
で、保守的なGCでは大規模開発は難しいんじゃないかと書いたが、2chのD言語スレの反応を見ていると、どうも私の書き方がまずかったんじゃないかという気がしてきたので補足してみたい。
まず、一般的なGCの仕組みについてはこのページが参考になる。
http://www.is.s.u-tokyo.ac.jp/~vu/01/jugyo/processor/process/soft/compilerresume/coverq8/coverq8.html
http://www.is.s.u-tokyo.ac.jp/~vu/01/jugyo/processor/process/soft/compilerresume/gc/gc.html
前回も書いたが、D言語では保守的なGCを使用している。正確に言えば、現在のD言語が保守的なGCを使用しているだけであって、D言語の仕様上は保守的なGCにしなさいとは書かれていない。だもんで、そのへんの実装は将来的には変わりうる。
そうは言っても、現在保守的なGCを載せていることには違いないわけで、D言語で書かれたゲームでリアルタイム性はどうなるのか?というのは当然疑問としてある。ABAさんのP47とTumiki Fighterを例にあげて考えてみよう。
P47:
http://www.asahi-net.or.jp/~cs8k-cyu/windows/p47.html
Tumiki Fighter:
http://www.asahi-net.or.jp/~cs8k-cyu/windows/tf.html
どちらもリアルタイム性の必要なゲームだし、マシンが遅くてフレームが落ちることはあったとしても、GCが動くがためのフレーム落ちが起きているようには見えない。
それはどちらも、ゲーム中のフレーム落ちして困る部分ではnewを一切行なっていないからである。(詳しく確認したわけでないので間違ってたらスミマセン)*1 つまり、(ゲームのメイン部分を実行中は)GCは一切呼び出していないし、GCに頼ってもいない。
事前にnewで生成したオブジェクトを貯蔵しておき使うわけだ。このテクニックは、Object PoolingだとかFlyweightだとか呼ばれる。詳しいことは、こちらのページでも見て欲しい。
http://msugai.fc2web.com/java/perform/objcre.html
それでは、GCを呼び出すとまともな速度は出ないかというとそうでもない。この規模ならば、newをある程度使って、かつ、毎フレームfullCollectを行なったとしてもそれは1ms以下だろう。
P47,Tumiki FighterはSDL+OpenGLで開発されている。サウンドやグラフィックのためのメモリのallocateはたいていはSDL側で行なうので、D言語のGCの処理対象ではない。実際、GCのヒープから割り当てているメモリはせいぜい1MB程度で、この程度ならばfullCollectしたところで何の問題もないし、巨大な配列は外部のallocatorで割り当てるので、GCが保守的で、データ配列の中身もスキャンするというデメリットは、ほとんど表面化してこない。
GCのヒープから割り当てられたメモリ量から判断するに、P47やTumiki Fighterは小規模のプログラムに属すると言えるだろう。
それでは中規模〜大規模なプログラムとはどんなものだろうか?市販レベルの規模のゲームであっても、データ配列を外部のallocatorで割り当てるならば、GCのヒープから割り当てられたメモリ量は、せいぜい10MB以下だろう。Pentium4の2GHzのマシンで、保守的なGCでfullCollectしたとして、10ms〜20msぐらいだろうと思う。ゲームで使うにはやや致命的な時間だが、incrementalなGCであれば、一回のcollectは1ms以下にはなるだろうから、そういう意味では、まあ、何とかなるのかな、と思わないでもない。外部のallocatorで割り当てている以上、その割り当てられたメモリの解放はGCには頼れないわけで、何だか理不尽なものを感じなくもないが、まあ、それは仕方ない問題だと思う。
ここでの結論としては、市販ゲーム(中規模程度のプログラム)では保守的なGCのままでは辛い部分もあるが、それでも作れなくはないということだ。大規模のプログラムは.NETのGCのようなまともなGCでもうまく動くのかどうか未知数の部分がある。実際のところ作ってみないと問題が見えてこない部分もあると思うので、自分で作るまでは判断を保留しておきたい。そんなわけで大規模のプログラム(ゲームに限らず)の仕事ください。m(_ _)m>誰か
*1:ABAさんがフォローしてくださいました→http://d.hatena.ne.jp/ABA/20040412#p1