今年も一週間終わったとか、あるよね。
年末年始は久々にフルで休み。前半は家でごろごろしてたら終わって、後半は帰省してごろごろしながらVitaでトトリやってたら終わった。
長い休みはいろいろやりたくなるけど、どうせいろいろはできないんだからプログラム書きだけやっておこう、と思ってたんだけど結局ゲームくらいしかやってないわ。まあゲームだけでもやってただけましなので問題はない。
トトリは船取ったあたりまで進んだ。もうそろそろ終わりだと思うけど。アトリエシリーズは昔マリーのアトリエやってやり方がよくわからずに挫折した覚えがあるんだが、今になったからなのかトトリはだいぶぬるくなったからなのか普通に楽しめた。まったり遊べるのがうれしい。
ただ今のバージョンだとセーブしようとした時にたまに落ちるのはいただけない。ソフトの更新はしてあるんだけどなぁ。もしかしたらシステムのバージョンが最新じゃないかもしれないのであとで確認しておくか。
ゆっくりとだが進んでるゲーム作り。 ゲーム部分を作り込んでいってそれっぽくなってきた。
ピンクっぽいのが地形で、中央付近の箱が自機でちょっと左の箱が敵機。黄色い点は敵を倒してばら撒かれたお金?的なアイテム。接触すると取れます。 丸くて線がちょっと出てるのが弾。線は最後に衝突判定を行なった範囲。画面では出てないけど敵も弾を撃ってきます。
この画面だけだとビューポイントみたいって言われるが、それって単に斜めだからってことじゃねーのかとかも思わないでもない。フラットシェーディングなところも似てるのかもしれない。フラットシェーディングなわけでもないんだが、現状弾が小さい球になってる以外は箱だしな……。まあでもある程度モデルを作りこみつつ全部フラットシェーディングなのもビューポイントっぽくかわいいかもしれない。テクスチャ実装してないから使えないしな!
動作は、段差があることからもわかるかもしれないがジャンプとかできて高低の概念があるし、実は任意スクロールだしであんまりSTGっぽくもない。あんまりSTGっぽくするつもりは元々ないんだよねぇ。
しばらくは家のメインマシンで作ってたからまだ動くような状態ではあるんだけれども、そうは言ってもスクリーンショットを見てわかるとおり12fpsしか出てない。上の160fpsは描画してない更新の頻度なので、描画がとても重いのは明らかだ。描画する物を増やすと持ち歩いてるLOOX Uではさすがに重くてしんど……え、重いどころかブルースクリーンで落ちたんですけど?!
しばらく画面が黒くなったあとブルースクリーンで落ちて、勝手に再起動するもののカーソルしか出ずに真っ黒の画面のままになってしまうので強制的に電源切って再起動すると復帰した。二度試してみたものの全く同じだったしブルースクリーンもディスプレイドライバで落ちてるっぽい表示をしていたので何か秘孔を突いてしまっているようだ。こまったなぁ。
特におかしなことはやってるつもりもないので回避は難しいかも。 ANGLE使ってるんでこいつを最新にしてみるという手はあるが、ドライバの問題っぽいので望みは薄そうだ。
うーん、そうなるとLOOX Uでの開発は難しいなぁ。 ANGLE使わないとOpenGLはソフトウェアレンダラになっちゃうし、Direct3Dを使おうにもそもそもANGLE使ってんだから既にDirect3Dになってるぜ。 Linuxとかはきっといろいろしんどいし、新しいマシンを買おうにもこのサイズのHWキーボード付きマシンは出てない。出たら多少高くても買うんだけど。
むむむ、しばらくはおとなしく家で作ることにするか……。
まあそれにしても描画は重いのでなんとかしたい。スクリーンショットを見る限りMATRIXが24msととてもでかい。3D物の描画が28msかかってるのにそのうち24msが行列演算だと?!といってもシェーダに行列を渡してる部分も入ってますけどね。それにしてもでかすぎるっつーの。
行列もまだPure Rubyで書かれたままだし、全部4x4行列だしそれのかけ算をしたら相当な量になるもんなぁ。当然法線用に逆転置行列とか作ってるしな。でも本当にそこが重いのかもっとちゃんと調べたいんだが、どう調べたものか難しいぜ……。
PeerCastStationは細々と修正していた。
とりあえずしょぼいバグを修正して上げたり、依存するjQueryとかのバージョンを上げてみたりしてた。 あとなんだかリレー送信が上手くいかない不具合が手元で出ていたので修正してみた。なんか変な気もするのであとでもう一回調べたほうがいいかもしれんが。
ちょっと前から気がつくとPeerCastStationがすごいCPU食ってるという報告を貰ってるんだが、原因が分からんので難しい。 なんかのスレッドがものすごい勢いで回ってるっぽいんだけど、心当たりが無いんだよなぁ。
せめて手元で再現できればと思うんだが、そういや俺の手元でもたまに固まってしまうことがあったな。いつもVisualStudioをアタッチした状態で動かしてるのでそういう時はすかさずブレークしてみるんだが、ブレークできずにVisualStudioごと固まってしまうので原因追求できずに困るという。その状況ではGUIが固まってるので貰ってる報告とはちょっと違うようなんだけど、VisualStudioがアタッチされてるという状況も違うしな。
手元動かしてるのをVisualStudioをアタッチせずに動かしておいて、変な状態になった時になってアタッチするようにしてみるか。
PeerCastStationと直接は関係ないんだがエンコーダを作り始めた。といっても単にffmpegのフロントエンドなのでエンコーダを作るというのはおかしいんだが。
PeerCastStationだとwmv(というかasf)の他にmkv(とwebm)とflvが配信できるようになってるんだが1、mkvもflvもエンコーダがない。PeerCastStationで配信するにはストリーミングサーバからhttpでGETしてきたコンテンツを垂れ流すしかないので、オフラインでエンコードするエンコーダがあってもあんまり意味ないのである。HTTPで出力できるストリーミングサーバ内蔵のライブエンコーダが欲しいのですよ。Windows Media Encoderはほんと素敵だなぁ。
VLCはそういう使い方もできるはずなんだが、いろいろ試した結果、どうも上手く動くことが少ないというのがわかった。 ffserverはばっちりそういう物ではあるんだが、Windows版のバイナリがない。cygwinじゃないとビルドできないらしい。さらに設定は独自のテキストファイルで書かないといけなくてこれが結構難しい。なのでffserverに相当する部分を自分で作ることにしてみた。
まずffmpegの使い方をいろいろと試してみて、どういうパラメータを渡せば望む動作をするかはなんとなくわかった。
ffmpegの出力はそのままではファイルになってしまうので標準出力に出すようにして、httpでアクセスされたときにffmpegを起動して標準出力を読み取って返すだけのスクリプトを書いてあげた。 じゃあこれにGUI被せてあげればいいや。
スクリプトはRubyで書いたんだけどRubyでGUI書くのは鉄板なライブラリが無くてしんどい。.NET行こう。ついでにせっかく最近覚えたのでF#で行こう。
HTTPでアクセスされたらffmpeg起動して標準出力を読み取って返す、ってロジック部分をF#で書いてやった。HTTPのヘッダをCRLFCRLFが来るまで読み取るってのがF#らしく書くのが難しかったが、再帰とか使って上手いことF#っぽく書けたので満足だ。 非同期処理も簡単に書けて結構いい感じだね。
ロジックは出来たのでじゃあGUIを被せようとWPFを使おうとしたんだが、F#のプロジェクトテンプレートにはWPFアプリが無い。Windows.Formsアプリも全然無い。調べてみるとロジック部分はF#で書いてGUIはC#で書きましょう的な話がみつかる。あれー?よく読むとF#には部分クラスがないのでXAMLのコードバックエンドが作れないとな。え、まじで。部分クラス無かったのか……。それでも頑張って使おうとすれば使えるよ!という話だが、コードバックエンドが作れないというのはつまりIronRubyからWPFをいじるのと同じようなことやればできるってことだろ。すげー大変なんだよそれ!!
諦めてC#でGUI書くか……。というところで止まってる。まあぼちぼち進めていきたい感じだ。
あー、Oggも対応しないとな ↩