自分のためのプログラミング雑記

C/C++とかゲームプログラミングに関して、自分用のメモとして書く場所

DXライブラリの描画の話2

前回の記事、DXライブラリの描画の話 - 自分のためのプログラミング雑記の高速化部分についての続き。

今回は、2枚の違う画像を順に描画するのと、1枚の大きな画像か一部分を抜き出して作成した新しい画像2枚を順に描画するのでの速度の違いを検証します。

なお、開発環境は最初の雑記 - 自分のためのプログラミング雑記を参照。また、前回と同じ部分は省きます。

以下ソースコード

2枚の画像を順に描画

        int gr = LoadGraph( _T( "test256.bmp" ) );//画像1の読み込み
        int gr2 = LoadGraph( _T( "test256_2.bmp" ) );//画像2の読み込み

	for(int i = 0; i < 10; i++ )
	{
		//計測開始
		auto start = std::chrono::system_clock::now();

		for( int j = 0; j < 1000; j++)
		{
			DrawGraph( j, j, gr, TRUE);
			DrawGraph( j, j, gr2, TRUE);
		}

		//計測終了
		auto end = std::chrono::system_clock::now();

		//計測結果の出力
		std::cout << "time = "
			<< std::chrono::duration_cast<std::chrono::milliseconds>( end - start ).count()
			<< "msec."
			<< std::endl;
	}


1枚の大きな画像から一部分を抜き出して順に描画

	int graphHandle = LoadGraph( _T( "testGraph/test2048.bmp" ) );//元になる画像の読み込み

	int gr = DerivationGraph( 0, 0, 256, 256, graphHandle );//256サイズで画像を作成
	int gr2 = DerivationGraph( 256, 256, 256, 256, graphHandle );256サイズで画像を作成

	for(int i = 0; i < 10; i++ )
	{
		//計測開始
		auto start = std::chrono::system_clock::now();

		for( int j = 0; j < 1000; j++)
		{
			DrawGraph( j, j, gr, TRUE);
			DrawGraph( j, j, gr2, TRUE);
		}

		//計測終了
		auto end = std::chrono::system_clock::now();

		//計測結果の出力
		std::cout << "time = "
			<< std::chrono::duration_cast<std::chrono::milliseconds>( end - start ).count()
			<< "msec."
			<< std::endl;
	}

2枚の画像を描画するほうは、縦横ともに256サイズのbmp画像を使用。
1枚の画像から抜き出すほうは、縦横ともに2048サイズのbmp画像から256サイズになるように抜き出して使用。
それぞれ1000個ずつの描画が終わるまでの計測を5回おこなった場合の時間を調べた。

以下結果[msec]

ループ回数 別の2枚 1枚から抜き出し
1 42 67
2 43 52
3 44 3
4 39 3
5 47 2

表から分かるように、別の2枚から描画するよりも1枚から抜き出して描画した場合のほうが複数回呼び出された時に高速化されることが分かった。
DXライブラリは同じ画像を連続で描画すると高速化するということが検証できた。

ただし、たとえ1枚から抜き出した場合でも間に関係の無い画像を描画すれば高速化はリセットされるため、高速化を意識して書く場合は注意が必要である。


以上