連番画像作成アプリ(Actor版)
Actorを利用して、マルチコア環境で高速化する(はずの)ものにしてみた。
「actor { ... }」って、Rubyのthreadの様に書けるので便利ね、
この場合「loop { ... }」の存在が生きてくるように感じる。
あと、senderがあるので、
erlangみたいに、わざわざselfを投げなくても良くて、超便利。
さらに、これを改良して、リモートのActorを呼べる様にする予定。
import scala.actors._ import scala.actors.Actor._ import ryugate.image._ import ryugate.video._ import ryugate.text.Format import java.awt.Font import java.awt.Color import java.io.File object make_sequence extends Application { val rate = 10 val second = 10 for (i <- 0 to rate*second) { actor { make_frame(i) } } def make_frame(no:int) = { val act = actor { loop { react { case "get" => sender ! make_image(no, rate) exit() } } } act ! "get" loop { react{ case img:Image => val filename = Format.sprintf("images/%04d.jpg", no) println(filename) img.write("jpg", new File(filename)) exit() } } } def make_image(no:int, r:int) = { val img = new Image(400,300, Image.TYPE_INT_RGB) img.clearBackground(Color.BLUE) img.process((g) => { g.setFont("MS Gothic", Font.BOLD, 48) g.antialias((g) => { g.drawString(new Timecode(no).tc(r).toString, 50,100) g.drawString(Format.sprintf("%04d", no), 50,150) }) }) } }