サイログ。

~雑多な記事置き場~

renderメソッドは使い様

Diagram::NodeBaseモジュールに存在するテンプレートメソッド、renderメソッド。

このメソッドは、ふだんは、描画の順番や指示を手動で行えるScreen.renderメソッド用に存在しています。
そのため、「Screen.update使ってるぶんには無用の長物」とか思われるようですが、どころがどっこい、Screen.updateと併用しても十分に役に立つことがあります。

たとえば、「デジタル時計を表示する」ときがわかりやすいと思うので、これで説明します。

デジタル時計を表示するとき、処理としては

  1. 画像部分を消去する
  2. 時間を画像に描画する

の繰り返しなんですが、これをDiagram使って非同期実行するとなると問題が発生します。
その問題とは・・・


画像を消去下瞬間にスレッドが移り変わってScreen.updateが呼ばれ、何も描かれていない画像を表示する

ことです。

この症状が起こると、何も表示されなくなったり、画面がチラツくなどの弊害が出ます。

そのために、「ちゃんと時間が描画されるまで画面に描画されない」ことを保証しなくてはなりません。

そこで出てくるのがrenderテンプレートメソッドです。

renderテンプレートメソッドは、update_inputと同じく、明示的に呼び出す必要があるメソッドです。
しかも、実は、Screen.updateメソッドとも併用できます(renderテンプレートメソッドを呼んだだけでは実際に画面に描画するわけではないのだ! な、なんだってー!(AA略))

そこで、上記処理をrenderテンプレートメソッド内に記述して、Screen.updateを呼び出す直前にDiagram::Processor#renderメソッドを明示的に呼び出すコードを入れます。

(例)
@clock = Diagram::Processor.new(...)
 :
@clock.render
Screen.update

こうすれば、「時計の更新」と「画面への描画」が同じスレッドで行われますので、綺麗な時計が表示されます。

是非お試しあれ。