くまりゅう日記

もっと過去の日記
[.NET | BeOS | Blender | COLLADA | fossil | mono | monotone | NPR | OpenGL | PeerCastStation | Riko | Ruby | Silverlight | TRPG | XNA | ゲーム | ゲーム作り | プログラム | | 模型]

2013-11-05

日記

おお気付いたら三連休ほとんど外に出ていない。 ゲームマーケット行こうかと思ったんだけど本の取り込みだけして行かずじまいだった。

もう11月か。つかもう2週間後には香港か。 準備しないとな……ってスーツケースに衣類をつっこんで行くだけのはずなので特に準備するようなこともないと思うけど、確認くらいは早めにやっておいた方がいいな。

[ゲーム作り] 重い

ゲームはルール変更してまだこれでいいかどうかはよくわからんけど、とりあえずステージをある程度作ることにした。

マップの作成はDSL的なので書くようになってるけどめんどくさかったのでちょっとやりやすく整理した。 ちょっと簡略化しすぎた気もするが足りなくなってからなんとかしよう。

あとマップ変更の度にゲーム再起動はめんどうなのでF5キーでリロードできるようにしよう。 ……重い。10秒くらいかかるんだが?

調べてみるとマップの隣接してるセルをくっつけて大きくしてるのが遅いようだ。 あー、セルリストに隣のセルがあるかどうか判別してるところだな。配列を先頭から全部検索してるのが遅いわ。 SortedSetが使えるかと思ったけど微妙に使えなかったので自前で似たようなのを作って解決した。

狭かったマップをこれで拡大できるぞーとやってみると重いな。 LOOX Uとかいう非力マシンで動かしてるのでめちゃくちゃ重いのは知ってるんだけど、敵が多くなったからかさらに重くなってきた。 メインマシンでも動かしてみると10fps前後くらいしか出てない。敵減っても30fpsくらいにしかならんのはどうかと思うが敵重すぎるなー。

どこが重いのか計ってみると普通に描画が重いのは既知なので置いておいて、衝突検出・処理が重いようだ。 コードを見てみると手抜きでN^2のオーダになるわー。なるほど敵が多いと重くなるわけだ。 衝突検出の一件毎はそれなりに真面目に書いてあるっぽく見えるのでそんな簡単に改善はできそうもないので、判定自体を減らす方向でやらんといけないな。 めんどくせ……。

描画が重いのもなんとかしたいけどこれはなんともならない可能性もあるので、衝突検出を先になんとかしてからだな。

[PeerCastStation] RTMPサーバ作った

PeerCastStationでFLV配信をする時には

OBS等のエンコーダ→(RTMP)→rtmpdumpか何かでFLVにする→FLVを受け取ってHTTPで出すサーバ→(HTTP)→PeerCastStation

という回りくどいことをやる必要があったんだが、めんどくさいので

OBS等のエンコーダ→(RTMP)→PeerCastStation

の形にしたい。 これを実現するためにはPeerCastStationにRTMPサーバを仕込まないといけないので、せっせとRTMPサーバを作る作業をしてたんだが、土曜日で大体できた。

RTMPは仕様書が歯脱けで概要はともかく細かいところになるとさっぱり参考にならんし、OBSを接続しても細かいデバッグメッセージみたいなのは出ないので困ったなーと思ってたんだが、OBSの内部でも使われてるっぽいrtmpdumpのソースを参考にしつつ、rtmpdumpを接続してデバッグメッセージを見てたらだいぶ参考になってそれっぽく動くところまで漕ぎ着けた。

OBSからエンコードデータを受け取ってFLVに書き出すまで問題なくできたので上手くいってると言っていいだろう。これで目的は達成できたようなもんだ。

試しにFlash Media Live Encoderを接続してみると一見問題なく動くんだが、切断時におかしなデータを受信してしまう。どうもcloseStreamあたりのコマンドを送ってきてるみたいなんだけど、なぜかcloseStreamという文字列の前に謎のデータが4バイト分くっついててデコードできん。さらに言うとそのあとの長さも足りないようなので4バイト程ずれてんのかな?しかしメッセージのヘッダは正常ぽく、それとボディの間で受信中にずれる箇所があるようには思えん。 しばらく調べてみたけどわからんのでギブアップした。必要になったらその時また調べよう。 どっちにしろFMLEはFlash Media Serverにしか接続しちゃいけないライセンスなので実際は使えないしね。 あ、開発用のテストに使うくらいは勘弁してください。

RTMPサーバは出来たもののRubyで書いてあるのでこれをそのままPeerCastStationにつっこむわけにはいかない。 それ以前にPeerCastStationはHTTPでサーバからPullする形でしか配信開始できないので、クライアントからのPushで配信開始する方法も作らないといけない。 これはけっこう大改造になりそうだなぁ。

日曜は組み込み作業やる気力もなかったので、ついででRTMPでの再生をできるようにした。基本的には録画がpublishコマンドが来たらクライアントから音声と動画データがたらたら流れてくるのに対して、再生はplayコマンドが来たらサーバから音声と動画データをたらたら流せばいいというだけだった。 録画時はクライアントから受信した時にだけ反応して動作すればよかったサーバが、クライアントからのコマンド受信を受け付けつつデータを垂れ流さないといけないのはそれはそれで面倒だったけど思ったほどではなかった。

メタデータの扱いだけがよくわからんことになっていて、録画は@setFrameDataとかいうプロパティに対してonMetaDataとその値が飛んでくるけど、再生時にはonMetaDataとその値だけ流せばいいだけになってた。なんでだろうな。

そんなわけでOBSでpublishされたデータをそのままRTMPでつないできたVLCで再生というところまで上手く動いてくれた。やったー。

エラー処理がほとんどないとか粗は沢山あるけれど、一通りやり方は分かったので完成ということにした。今後これを真面目に使うことがあったらその時にまた整理すればよかろう。まあせっかくなのでどこか適当なところに置いておいてもいいけど……。

あとはどう上手いことPeerCastStationにつっこむかだな。


ページのトップへ | トップ «前の日記(2013-10-29) 最新 次の日記(2013-11-12)» | 編集 | kumaryu.net by kumaryu