たまたま使ってるエフェクトを切り替えたらモデルの一部がぶっこわれやがった。
しかし切り替えたのはいんちきグローのポストフィルタを有効にしただけ。モデル全然関係ないよー。
どうもおかしいのでまたドライバがおかしいのかとも思ったんだが、最近ドライバの更新してないし。ちょっと前まではフィルタONでもちゃんと動いてたし。俺のバグだろう。
で、最近いじったところを探してたらglDrawElementsに渡すインデックスを激しく間違ってた。2個ばっかりが負の値になって変なところ参照してたよ!
それでもしばらくは上手く動いてるように見えてたのだから恐ろしい。エラーも出てなかったし。
それとは関係無いんだが、glFramebufferBlitEXTでMSAAなFBOからデフォルト(0番)のFBOに転送してみたら何も起きなかった。何事もなく動いたんじゃなくて本当に何も起きなかった。
うん、まあ、Blitの手抜き実装っぷりからそうだとは思ったよ。
ゲームが重いんだがGCの時間ははかってないなー、もしかしてGCが超重かったりするのかなー、というのが前回までのお話。
しかしGCの時間なんてどうやって計れば…と調べてみたらDTraceで取れるらしい。こいつもたまには役に立つのな。
わかりづらいDTraceのマニュアル読みながらなんとかGCの発生間隔とGCの実行時間をとった。
だいたい、500ms間隔くらいで発生して一回で50ms前後かかってるらしい…。
あまりの数字に桁を何度も確認したが、あってるっぽい。まあ感覚的にもそう間違ってない数値だわ。
500ms間隔で発生するのもなかなかの数値だがこれはそれほど問題にはならんだろう。いつかは起きるものだ。
しかし、一回で50ms、つまり3フレーム分止まるのは死にたくなる。確かになんかがくがくしてたもんなぁ。
じゃあこれが無ければ速いのか?と完全にGC止めてみたけど、べつにfpsあがったりもなかった。
しかし滑らかにはなったので気持ちよく動きはする。なるほど、ある程度の時間で平均しちゃってるfpsにはあんまり出てこないけど、しっかりダメージはあるのね。
うーん、使い捨てオブジェクト減らすことは出来るけど、それをやった所で停止時間短くはなるのかなぁ。
GC間隔が長くなるだけだったら、苦労のわりに嬉しくないし。まあGCが三十分に一回くらいまで間隔を延ばせるなら3フレームくらい落ちても気にしないけど、さすがにそこまで減らすのは大変すぎるだろ*1。それなら最初から全部Cで書くって。
とりあえずそんなにタイミングシビアなゲームじゃないつもりなので、情報を集めて、停止時間が短くなるようだったら使い捨てオブジェクトをできるところから減らそう。そうでなければとりあえずは今回は諦めるか。
他にも重いところはありそうだし、それ以上にやらなきゃならないこと沢山だものねぇ。
*1 浮動小数点演算しただけで捨てオブジェクト発生しちゃうもんなぁ。