rockenfield は、lucille のディスプレイドライバです。単にファイルを表示するだけではなく、TCP/IP を介して直接 lsh からレンダリング結果を得て表示することができます。
標準ではビルドされず(たしか)、tools/rockenfileld の中身を自分で make する必要があります。また、ビルドには fltk-1.1.9 が必要です。
まずは rockenfield を起動しておきます。
>rockenfield
rib の中で、出力先を socket にします。
※lsh の –output オプションは効かない?
Display “” “socket” “rgb”
レンダリングすると、rockenfield 上にレンダリングした画像が表示されます。…がっ、ここでまさかの rockenfield が死亡(涙。再描画に問題があるのか?要調査です。
そういえば、私は fltk-1.1.8 でコンパイルしているので、これが悪さをしているのかも。ちゃんと作りなおしてみますか。。。
syoyo さんからコメント欄で教えて頂きました。どうやらマルチスレッドまわりの不具合のようです。
lsh に –threads=1 というオプションをつけてやればうまく動きます。
> fltk-1.1.8
特に mac だと不安定なので, 1.1.9 の利用をお願いします.
ついでに fltk は –enable-threads つきでコンパイルしておくとよいです.
1.1.9 でもダメですね。
一番最初だけ表示されて、そこで固まっちゃうみたいです。
そしてそのまま rockenfield さんが bus error と。
うむむ。
ども, レンダリング結果を送るのに TCP/IP だと send() を使っているのですが、これがスレッドセーフでないようなので、マルチスレッドでレンダリング(デフォルトはコア数ぶんのスレッドを立ててレンダリング)すると send() のデータが壊れて転送されて死ぬみたいです. こちらでも再現しました…
とりあえずは lsh –nthreads=1 input.rib で強制シングルスレッドにしてもらうとうまくいくと思います…
おぉ、動きました!!ありがとうございます。そして rockenfield の再描画バグも発見ww。マウスを動かしたりしないと再描画されませんね。これは fltk で取得するイベントを変えれば直ったはずです。詳しくはちょっと忘れてしまったんですがww
send()まわりは、git版のコードだといろいろマズいことが起こりそうな感じがします。特に、ネットワーク越しにデータを送るときちんと送られないかもしれません。
ざっと見た感じ sockdrv.c の sock_dd_write() を書き替えればバグは無くなりそうなので、私も勉強がてら触ってみようかと思います 🙂
ちなみに、socket まわりとかβテストにはそれほど重要ではないでしょうから、重要なことを優先して潰していっちゃってください。
私は趣味で勝手に触っているだけなのでwww
んー、ただ絵が保持できないのは問題なので、改善します.
作業としても、適切な場所にロックをかければいいだけなので.
やった!!おねがいします 😀
ディスプレイドライバ出力をスレッドセーフにしました.
git pull で更新ください.
fltk はどのイベント取得にすればいいか思い出してもらえるとうれしいです.
ありがとうございます!!…と思って pull したらコンパイルが
通らなくなりました(涙
fltk の再描画問題は、こちらで解決しました 😀
ちょっといろいろヤヤコシイ&もう眠いので、
エラーの件もまとめて、明日にでもメールで
お知らせします。