くまりゅう日記

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

2014-11-25

日記

特に何もやっていない。

三連休は帰省して、ねこの相手して買い物行ってねこの相手して買い物行ってねこの相手したくらいで終わった。充分と言えば充分なんだけれども。ねこ充。

サーバ移転しようと思ってたけどしてないなぁ。今月一杯で今のサーバ使えなくなるんであんまり余裕はない。日記さえ移転できれば他はファイルコピるだけだったり、俺しか使ってないバージョン管理サーバだけなので急ぎじゃないんだけど。平日の間にぼちぼち進めるか。

今週あたりに書き込んだコメントは新しいサーバに移行できず消える可能性があるんでお気をつけください。コメントなんてほとんどつかないけどさ。

[.NET] Taskむずい

RTMPサーバをC#で作るにあたってasync/awaitを全面的に使うようにしてみたんだけど、一本道で済まなくなるとやっぱり難しかった。

サーバ内でクライアントへメッセージを送信する場合は一旦キューに溜めたかったのでメッセージキューを作ったんだけど、これの取り出しが上手くいかなくて困った。 キューからの取り出し時に空だったらメッセージが入るまでawaitで待てるようにしたくて、キューの長さを管理するSemaphoreを待つTaskを作ってみた。しかしこれの取り出しになぜかめっちゃ時間かかるようだ。MSDNのWaitHandleをタスクで待つ方法を参考にした(というかほぼそのまま使った)んだが、SemaphoreをReleaseしてから待ちタスクが帰ってくるまでに何秒もかかったりする。これはおかしいだろ……。

待ちにスレッドプール使ってるのが気になるので、よろしくはないがSemaphore.WaitOneするだけのタスクを作ってみたらまともな速度で動くようになった。なんでだろう。Task使いまくってるおかげでスレッドプールがタスクで埋め尽されて自前で登録したスレッドプールなんかに回ってこないというのも考えられるんだが、それにしても下手すると10秒も回ってこないのは考えにくい。単に俺の作り方が何か間違ってるんだろうか。 待つだけで処理占有するタスク作るのはよろしくないので正当な待ち方したいもんだが。

上記の問題など不安なところはまだまだあるものの、なんとか動くようにはなった。OBSから配信したのを受け取って、ffplayなどで再生できてる。 VLCで再生したかったが、OSX版ではそれっぽく再生できてるもののWindows版のVLCだと正しく再生できない。 VLCのデバッグメッセージを見る限りではフレーム落とが発生しててマシンが遅すぎるだとかなんとか出てるんだが、サーバ側ではVLCへのデータ送信が滞っている模様。VLCって確かにそういう動作をするというか、一気にデータを受信するものの、そのあとバッファをある程度再生するまでは受け取りもしないっていうちょっといやらしい動きをするんだけれども、受け取らないわりにデータが遅れているっていうのはなんか変だな。でもいまいちおかしいメッセージを吐いてくるのもVLCではよくあることだから原因はわからんなぁ……。

そのあたりでわからなくなって眠くなったので終わり。最悪VLCでは再生できないでもいいんだが、VLCよく使ってるから俺が困るんだよな……。


ページのトップへ | トップ «前の日記(2014-11-18) 最新 次の日記(2014-11-30)» | 編集 | kumaryu.net by kumaryu