コンテンツにスキップ

1. Main 関数の構成

Siv3D の基本的な機能を使ってみましょう。

1.1 Main 関数の 3 つのパート

  • Main() 関数は 3 つのパートで構成されます
パート 説明 やること
メインループの前 プログラムが起動したときにまず実行される部分 画面の設定やテクスチャの作成
メインループの中 毎秒数十回繰り返されるループの中の部分 入力処理や描画
メインループの後 プログラムが終了するときに実行される部分 とくになし
# include <Siv3D.hpp>

void Main()
{


	while (System::Update())
	{

	}
}
# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{



	}
}
# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{

	}


}

1.2 メインループ

メインループは、プログラムを実行しているモニタ 🖥️ の表示周期(リフレッシュレート)に合わせて繰り返されるループです。一般に毎秒 60 回や 120 回です。

通常の C++ プログラムで for(;;) のようなループを書くと 1 秒に何万回もループしてしまいますが、while (System::Update()) は、System::Update() 関数が内部で自動的に待機をすることで、モニタの表示タイミングに合わせた頻度のループを作ってくれます。

System::Update() 関数は普段は true を返すので、半永久的にループが続きますが、特定の操作(ウィンドウの閉じるボタンを押す、Esc を押す)をすると、それ以降は false を返すためループが終了し、そのまま Main() 関数の終端まで到達するとプログラムが終了します。

1.3 メインループの前にやること

プログラムで画像を表示したいとき、「画像を読み込む仕事」は 3 つのどのパートに書くべきでしょうか。メインループの中に書いてしまうと、1 秒間に数十回も画像の読み込みの仕事が発生して動作が重くなってしまいます。

正解はメインループの前に画像を読み込み、それをメインループの中で描画することです。こうすれば最も少ない仕事量で目的を達成できます。

万が一、間違ってメインループの中に「画像を読み込む仕事」を書いて、毎秒数十回も画像を読み込む仕事が発生した場合には、Siv3D が自動的に問題を検出し、ログに警告を出力してプログラムを終了します。

動作が重くなる(Siv3D はログに警告を出力して自動的に終了します)

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		// 画像ファイルから画像データを読み込んでテクスチャを作成する
		const Texture texture{ U"example/windmill.png" };

		// テクスチャを描画する
		texture.draw();
	}
}

OK

# include <Siv3D.hpp>

void Main()
{
	// 画像ファイルから画像データを読み込んでテクスチャを作成する
	const Texture texture{ U"example/windmill.png" };

	while (System::Update())
	{
		// テクスチャを描画する
		texture.draw();
	}
}