うらおブログ(移転しました)スマートフォン用の表示で見るやねうらおブログ(移転しました)この広告は、90日以上更新していないブログに表示しています。Javahttp://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.htmlhttp://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言語で書かれたゲームでリアルタイム性はどうなるのか?というのは当然疑問としてある。Fighterを例にあげて考えてみよう。Fighter:http://www.asahi-net.or.jp/~cs8k-cyu/windows/tf.htmlどちらもリアルタイム性の必要なゲームだし、マシンが遅くてフレームが落ちることはあったとしても、GCが動くがためのフレーム落ちが起きているようには見えない。それはどちらも、ゲーム中のフレーム落ちして困る部分ではnewを一切行なっていないからである。(ゲームのメイン部分を実行中は)GCは一切呼び出していないし、GCに頼ってもいない。事前にnewで生成したオブジェクトを貯蔵しておき使うわけだ。PoolingだとかFlyweightだとか呼ばれる。詳しいことは、こちらのページでも見て欲しい。http://msugai.fc2web.com/java/perform/objcre.htmlそれでは、GCを呼び出すとまともな速度は出ないかというとそうでもない。この規模ならば、newをある程度使って、かつ、毎フレームfullCollectを行なったとしてもそれは1ms以下だろう。FighterはSDL+OpenGLで開発されている。サウンドやグラフィックのためのメモリのallocateはたいていはSDL側で行なうので、D言語のGCの処理対象ではない。実際、GCのヒープから割り当てているメモリはせいぜい1MB程度で、この程度ならばfullCollectしたところで何の問題もないし、巨大な配列は外部のallocatorで割り当てるので、GCが保守的で、データ配列の中身もスキャンするというデメリットは、ほとんど表面化してこない。Fighterは小規模のプログラムに属すると言えるだろう。それでは中規模〜大規模なプログラムとはどんなものだろうか?市販レベルの規模のゲームであっても、データ配列を外部のallocatorで割り当てるならば、GCのヒープから割り当てられたメモリ量は、せいぜい10MB以下だろう。Pentium4の2GHzのマシンで、保守的なGCでfullCollectしたとして、10ms〜20msぐらいだろうと思う。ゲームで使うにはやや致命的な時間だが、incrementalなGCであれば、一回のcollectは1ms以下にはなるだろうから、そういう意味では、まあ、何とかなるのかな、と思わないでもない。外部のallocatorで割り当てている以上、その割り当てられたメモリの解放はGCには頼れないわけで、何だか理不尽なものを感じなくもないが、まあ、それは仕方ない問題だと思う。ここでの結論としては、市販ゲーム(中規模程度のプログラム)では保守的なGCのままでは辛い部分もあるが、それでも作れなくはないということだ。大規模のプログラムは.NETのGCのようなまともなGCでもうまく動くのかどうか未知数の部分がある。実際のところ作ってみないと問題が見えてこない部分もあると思うので、自分で作るまでは判断を保留しておきたい。そんなわけで大規模のプログラム(ゲームに限らず)の仕事ください。電子書籍になるに至るまでの話ブログちょっとだけ移転のお知らせ時代はまだゲームセンターあらしに追いつかないのかやねうら王、電王戦バージョン提出しました将棋の神様のレーティングはいくつなのか?月別アーカイブはてなブログをはじめよう!yaneuraoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。