Surface は GPU メモリ上にテクスチャを作成し、このテクスチャはグローバルなリソースとして利用が可能。ただし GPU メモリ上のテクスチャは揮発性のもので、なにか事ある毎にテクスチャはメモリから消されてしまう。
GPU メモリ上のテクスチャはアプリケーション動作中でも永続性が保証されず、万が一テクスチャが消されたらまた作り直すという処理の循環が必要となる。
Surface を使ったデバッグ用ステータス表示
消えてもいいデータの代表格、デバッグ中にデバッグ用の情報を表示するための開発者用ステータスに Surface を利用する例。
予め必要なもの・インスタンス変数
DebugSF = noone;/* Surface 管理用、グローバルスコープが望ましい */ OnDebug = true; /* デバッグモードであることを示す管理フラグ */
普段は非表示だが、デバッグモードがオンの時に対応キーを押したらデバッグ用ステータスを Surface 上に書きこんで情報表示させるためのテンプレ。サンプルでは右クリック検出時に表示、非表示を切り替えるようにしてある。
Draw_Debug_Status(); はユーザ定義関数なので自分で作った処理を入れる。
テクスチャのサイズは 800 , 500 。非表示の時は Surface を破棄して GPU メモリ上から領域を開放。また表示する必要が来た時に新しく Surface を作る。これの繰り返し。
///Draw_Surface_Debug(); if (OnDebug==true){ var c,s,sx,sy; c = c_white; s = DebugSF; sx = 800; sy = 500; //if (keyboard_check_pressed(vk_tab)){ if (mouse_check_button_pressed(mb_right)==true){ if (DebugSF==noone){ DebugSF = surface_create(sx, sy); surface_set_target(DebugSF); draw_clear_alpha(c, 0); draw_rectangle_colour(0,0,sx,sy, c,c,c,c,false); Draw_Debug_Status(); surface_reset_target(); } else{ surface_free(DebugSF); DebugSF = noone; }; }; if (surface_exists(s)){ surface_set_target(s); draw_clear_alpha(c, 0); draw_rectangle_colour(0,0,sx,sy, c,c,c,c,false); Draw_Debug_Status(); surface_reset_target(); draw_surface(s, 0, 0); }; };