toru
toru****@gwaih*****
2004年 8月 15日 (日) 00:12:48 JST
こんにちは。LLW の Lightning Talk で Gauche-gl を使って発表をした久井 です。 発表に使ったプログラムの画面出力をフレームごとに画像ファイルにダンプし て、ムービーにしようとしているんですが、なかなかいい方法が思いつきませ ん。 まず最初に試したのは、(glut-swap-buffers) の直後に (sys-system #`"/usr/X11R6/bin/xwd -root | xwdtopnm | pnmtopng > screen-dump/,(format #f \"~4,'0d\" *current-frame*).png") というきわめて安直なやり方でしたが、なぜか途中でかならず X が黙ってし まうので、使えませんでした。 で、次に、もうちょっとまじめに gl-read-pixels を使ってみましたが、異常 に時間がかかってしまいました。こんな風に書きました: (define (dump-pixels) (let ((seq (gl-read-pixels 0 0 640 480 GL_RGB GL_UNSIGNED_SHORT_5_6_5))) (print "P3") (print #`"# ,*current-frame*") (print "640 480 63") (for-each (lambda (x) (let ((r (logand (ash x -10) 62)) (g (logand (ash x -5) 63)) (b (logand (ash x 1) 62))) (print #`",r ,g ,b"))) seq)) ) ) これだと、画像 1 フレーム分書き出すのに、40 秒くらいかかってしまいまし た。(マシンは Pentium III 500 MHz、メモリ 128 MB。) どうも、シーケンスの for-each が時間を食うようです。for-each の代わり に、単純に (write seq) とやった場合でも、20 秒くらいかかりました。 で、質問というか、なにかアイディアがあれば教えていただきたいんですが、 この gl-read-pixels の作るベクタをもっと高速に出力する方法、あるいは gl-read-pixels 以外でなにか画面イメージを保存する方法ってないでしょう か? -- と お る 。 toru at gwaihir dot biz http://torus.jp/