GameMaker 日本語掲示板

関数内のローカルなstatic変数が便利かもしれない

5 コメント
views
17 フォロー

関数内のローカルな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なローカル変数を使えば余計な外部変数を減らすことができるかもしれないです

生高橋
作成: 2022/03/15 (火) 18:10:10
通報 ...
1

こういうことをやるためにオブジェクト(この例でいうとo_show_timerみたいな名前の)を作って処理していましたが、
関数自体にそういう振る舞いをさせることができるんですね!

2
生高橋 2022/03/15 (火) 19:57:39

そうなんですよ。
ただメモリはプログラム終了まで残り続けてしまいます...

3

プログラミングの解説、すごくありがたいです!

4
ぽんでり 2022/03/16 (水) 22:28:22

これいいですね!ありがとうございます!

5
生高橋 2022/03/17 (木) 09:08:42

【追記】show_timerの関数普通にみすってたので直しました...