メインループの書き方

プログラムを作るとき一番最初に考えるのがmain関数でのループ処理だと思います。このWikiではシンプルを重視して以下の書き方をしてきました。

// 昔(GBAプログラム研究所さんから)の書き方
void WaitForVsync(void)
{
	while (*(volatile u16*)0x4000006 >= 160) {};
	while (*(volatile u16*)0x4000006 <  160) {};
}

int main(void)
{
	// TODO

	for(;;)
	{
		WaitForVsync();

		// TODO
	}
}

ところがこの方法だとforループ中もCPUが動いているため、バッテリーを無駄に消費します。とてもエコではありません。そこで待っている間はCPUをお休み(HALT)させて、VBLANKになったら起こすことにするといいのではないでしょうか。devkitProのサンプルプログラムにその方法が書いてあったので流用させていただきました(^^;。

HALTを使おう

今までウェイトをするとき、VBLANKを待っている方法を採用していました。

ポイントはVBLANKの割り込み許可して、VBLANKハンドラに「REG_IRQ_WAITFLAGS |= IRQ_VBLANK;」をさせることです。この処理を忘れるとmain関数の「SystemCall(5);」を呼んだ時、永久ループしてしまうので注意してください。ゲームを作るときは、この形を基本にするのがいいと思います。

状態遷移を使おう

履歴


トップ   一覧 検索 最終更新   ヘルプ   最終更新のRSS