まずユーザ定義 surface があるか確認、無ければ作る必要がある。
手順を確認しよう
if else
ステートメント処理が必須で、フェイルセーフ(fail safe)なコード設計を実現するためには必ず surface の存在確認を毎回行うことが重要となります。
以下にちょっとコードを書くが、このコードはコピペしてはいけない説明用でかつ省略版です。
User_Defined_Surface
という変数の定義部分をわざと省いたからで、理由は後で記す。
if !surface_exists(User_Defined_Surface)
//常に確認、無ければ作る
{
var sw,sh; sw=400; sh=200; // 矩形領域の大きさを定義
User_Defined_Surface = surface_create(sw,sh); // Surface を作る
surface_set_target(User_Defined_Surface); // ターゲットにセット
draw_clear_alpha(c_blue,1); // ターゲットを draw で塗りつぶす
draw_text(0,0, "Try Draw"); // 試しに文字も書いてみた
surface_reset_target(); // ターゲットを解放
}
else // Application Surface への処理として
{
draw_surface(User_Defined_Surface,mouse_x,0); // 指定 surface を描画
};
これが基本。
-
if !surface_exists のステートメントでは実際の描画はまだ行なっていない。
「無ければ作る」の部分は重要で、最初は作られてないからユーザ定義 surface が無い、これは当たり前。ところが「作ったものが無くなる」場合もあるので
if !surface_exists
この処理は常に必要となる。
なぜなのか?
surface というのは Application Surface とは異なり「volatile (揮発性)」なものであり、テクスチャとして GPU メモリ上に確保されている。
GPU メモリ上に確保されている限りアプリケーション的には surface をリソースとしてグローバル的に扱うことができるけど、アプリケーションのフォーカスが他のアプリケーション(例えばスクリーンセーバーなど)に切り替わったタイミングで、一旦邪魔だからせっかく作った surface でも GPU のメモリ上から破棄されてしまうかもしれない。
ユーザの環境/搭載されている GPUメモリ量にも依存するため、アプリの切り替えで surface が実際に破棄されるのかあるいはそのタイミングは予測ができない。
不測の事態を想定して常に surface の存在を確認する。だから「無ければ作る」という確認が常に必要となるのである。
参考 (YoYoGames):Surfaces