関数内のローカルなstatic変数を使うと次のフレームまで持ち越せる変数を関数内で記述できます
【ローカルstatic変数を使わないで記述してみる】
var t= get_timer();//計測開始
repeat(10000) {
instance_create_layer(0,0,"Instances".oTest1);
}
t = get_timer() - t;//計測開始&計測終了
show_debug_message(string(t) + "ms");//表示
repeat(10000) {
instance_create_layer(0,0,"Instances".oTest2);
}
t = get_timer() - t;//計測開始&計測終了
show_debug_message(string(t) + "ms");//表示
repeat(10000) {
instance_create_layer(0,0,"Instances".oTest3);
}
t = get_timer() - t;//計測終了
show_debug_message(string(t) + "ms");//表示
oTest1,oTest2,oTest3の生成の処理時間を計測する処理です
計測箇所が増えると似た記述が続きそうです
これを関数化するには関数外部にget_timerを保存する変数をつくらないといけません
ローカルstatic変数を使うとこれを解決できます
【ローカルstatic変数を使い関数化してみる】
//どこかに記述
function show_timer() {
static t = get_timer();
t = get_timer() - t;
show_debug_message(string(t / 1000) + "ms");
}
【使い方】
show_timer();
repeat(10000) {
instance_create_layer(0,0,"Instances".oTest1);
}
show_timer();
repeat(10000) {
instance_create_layer(0,0,"Instances".oTest2);
}
show_timer();
repeat(10000) {
instance_create_layer(0,0,"Instances".oTest3);
}
show_timer();
show_timerで囲えば処理時間が表示できるようになりました。※計測開始の時間も表示されてしまう
ローカルstatic変数は関数が最初に呼ばれたときのみ初期化され、アプリ終了まで保持されます
この特性を利用すれば関数内で計算した値を次のフレームまで持ち越せる変数を関数内で記述できます
そうすることで外部の変数に頼らないため独立した再利用しやすい関数をつくれます
【GIFキャプチャーできる関数の例】
//PostDrawイベントで呼び出してください
function gif_capture(surf = application_surface){
static isRecord = false;
static gif = -1;
if(keyboard_check_pressed(ord("G")))
{
isRecord = !isRecord;
if(isRecord) {
var w = surface_get_width(surf);
var h = surface_get_height(surf);
gif = gif_open(w,h);
show_debug_message("GIFキャプチャー開始");
}
else {
gif_save(gif,game_display_name + ".gif");
show_debug_message("GIFキャプチャー終了");
}
}
if(isRecord) gif_add_surface(gif,surf,2,0,0,2);
}
Gを押すとレコード開始して、もう一度押すとレコード終了になりGIFが生成される関数です
PostDrawEventで呼び出すだけで利用できます
ShaunSpaldingさんのGIFを作るチュートリアル動画から参考にしています
staticなローカル変数を使えば余計な外部変数を減らすことができるかもしれないです
こういうことをやるためにオブジェクト(この例でいうとo_show_timerみたいな名前の)を作って処理していましたが、
関数自体にそういう振る舞いをさせることができるんですね!
そうなんですよ。
ただメモリはプログラム終了まで残り続けてしまいます...
プログラミングの解説、すごくありがたいです!
これいいですね!ありがとうございます!
【追記】show_timerの関数普通にみすってたので直しました...