[Gauche-devel-jp] [Gauche-gl] 画面のダンプ

Back to archive index

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/



Gauche-devel-jp メーリングリストの案内
Back to archive index