Flashでターミナルエミュレータの実装方針

持ち物:

  • ncursesのWINDOW
  • WINDOWのバッファ×2(1つはncursesの中、もう一つは手元)


ptyからの出力を1回readするごとに:

  1. roteを経由してncursesに描画
    1. void rote_vt_inject();
    2. void rote_vt_draw();
  2. ncursesのWINDOWからバッファを持ってくる
  3. 手元のバッファと今持ってきたバッファを比較して、差分をFlashに転送
    1. 手元のバッファをそのまま比べた差分 -> 1
    2. 手元のバッファを一行下にずらして比べた差分 -> 2
    3. 手元のバッファを一行上にずらして比べた差分 -> 3
    4. 1, 2, 3で一番差分が小さいものをFlashに転送
    5. 最初は1だけで。効果がありそうなら2,3
  4. 手元のバッファを入れ替える


毎回バッファを全部走査するのが重そう。通信帯域の方が余裕があれば、差分を取らずに毎回全部送る。プロトコル上どちらにも対応できるようにすることも可能だと思うので、CPU使用率を見てどちらにするか判別するのもアリか。
差分を取るより圧縮した方が速くて軽かったりして。