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