9.7 アニメーションの高速化

多くのグラフィクスライブラリに用意されている、いわゆるダブルバッファリングという手法が EGGX でも利用できます。これは「描画中でもリアルタイムに表示する」のではなく「描画し終わってから表示を更新する」手法で、こうすることによって高速なアニメーションが実現できます。
EGGX ではこのために各ウィンドウごとに二つの画面(レイヤーと呼んでいます)が用意されています。レイヤー番号は 0, 1 です。例えば描画するレイヤーを 0、表示するレイヤーを 1 と分け、レイヤー 0 に描画し終わった後で表示レイヤーと描画レイヤーを入れ替えるか、描画レイヤーの内容を表示レイヤーに丸写しするのです。

標準状態では表示も描画も、ともにレイヤー 0 を使うように設定されています。

layer 描画レイヤーと表示レイヤーを設定する

layer(win, s, d)

引数 s, d は共に整数型で、レイヤー番号 0 または 1 を示す。s が表示レイヤー、d が描画レイヤーがどちらであるかを指定する。
以下に利用例を示す。

  #include <eggx.h>
  int main() {
    int win, flag;
    win=gopen(400,400);
    layer(win, 0, 1);
    flag=0;
    while( 1 ) {
      ....描画処理...
      if( flag == 0 ) {
        layer(win, 0, 1);
        flag=1;
      } else {
        layer(win, 1, 0);
        flag=0;
      }
    }
  }

描画レイヤーと表示レイヤーを毎ループごとに入れ替えるようにしている。次の copylayer も参照。
標準状態は layer(win, 0, 0) に等しい。

copylayer レイヤーの中身を他方にコピーする

copylayer(win, s, d)

引数 s, d は共に整数型で、レイヤー番号 0 または 1 を示す。s がコピーする元のレイヤー番号、d がコピー先レイヤーの番号を指定する。
以下に利用例を示す。

  #include <eggx.h>
  int main() {
    int win;
    win=gopen(400,400);
    layer(win, 0, 1);  /* 表示は 0 番、描画は 1 番レイヤーで */
    while( 1 ) {
      ....描画処理...
      copylayer(win, 1, 0); /* レイヤー 1 番の内容を 0 にコピー */
    }
  }

この copylayer 関数を使って高速にアニメーションを描画するサンプルプログラムを用意しました。bounce1.c プログラムではちらつきが出ているのがわかると思います。(もし違いが分かりにくければ、ボールの出現数を増やすなり、移動速度を遅くするなりして試してください。)
レイヤー機能を使わない例: bounce1.c
レイヤー機能を使った例: bounce2.c


Yutaka Yasuda (yasuda@bakkers.gr.jp)