DXライブラリ 画面のある一部だけ色を変えたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ピーちゃん

DXライブラリ 画面のある一部だけ色を変えたい

#1

投稿記事 by ピーちゃん » 8年前

DXライブラリでは、基本的にウインドウの背景色は真っ黒です。

例えば、「800*600のウインドウを作成して、その中の100*50から200*100までの区間は白色に変える」なんていうことは可能なのでしょうか。
それができなければ、白色の画像を作り描画しようと思いますが、できればソースから色を変えたいです。
その方法があればぜひ教えてください!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ 画面のある一部だけ色を変えたい

#2

投稿記事 by softya(ソフト屋) » 8年前

DrawBoxで塗るのが一番素直だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
V30
記事: 21
登録日時: 9年前
住所: 岡山県

Re: DXライブラリ 画面のある一部だけ色を変えたい

#3

投稿記事 by V30 » 8年前

私個人的には、『白色の画像を作り描画』するのがベストだと思います。

矩形の描画命令を使用するのは微塵ほどですけれど負荷がありますし、
画面消去後、シンプルにグラフィックハンドルからの画像を貼るのが
高速で良いと思います。

その他、DXライブラリを無視した描画方法も数通りありますが、結局
やる事は『矩形描画命令』『白画像を貼る』の二択が基本になります。

実行メモリを微塵でも減らしたいのであれば、『矩形描画命令』でも
問題ないレベルの負荷だと思います。



***DXライブラリのウインドウ(800×600サイズ)での処理時間***
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

【DrawBoxで(100, 50)-(200, 100)の領域を白塗り】→ 約120マイクロ秒

【(100×50)のBMP画像をDrawGraphで(100, 50)に描画】→ 約30マイクロ秒

※debugモード、GetNowHiPerformanceCount()使用での計測結果です!



ウチのPCでの大雑把な結果ですが、それぞれの処理時間の差は明らかです。

CPUによって処理時間比率に多少の誤差はあると思いますので、ご自身のPCでも
お試しになられたら、より理解しやすいと思います。



追記:

Releaseモードでも、どちらもdebugモードの場合とほぼ同じ処理時間でした。
素人的な質問は、素人に聞こう!

危ない危ない。
ちゃんとした人に質問しましょう。
ちなみに私は、ちゃんとしていない素人です。

アバター
V30
記事: 21
登録日時: 9年前
住所: 岡山県

Re: DXライブラリ 画面のある一部だけ色を変えたい

#4

投稿記事 by V30 » 8年前

PCや他のコードとの絡みで、処理時間にかなり幅がある事が判明しました。

以下のコードは、付け焼刃で只今作ったものです。
VS2013 Core-i7 920 2.67GHz 環境下で素で比べてみると、
殆ど同じ処理時間でした(汗)。
平均処理時間を出したい場合は、画面下部に表示されるテキストのコードを
ご参考下さい。

しかしながら……

こんな感じでアプリが完成するまでちょこちょこ様子を見ながらどの
方式がベストかをチョイスするのが一見良いみたいですが、実際に
裏側で行われている処理(レンダリング)を考慮すると、このコードで
見える数値だけでは断定できないです。

私はDXライブラリの内部設計についてはあまり詳しくないので、これ
以上の深い部分につきましては分からないです。
すみません。m(_ _)m

ライブラリの作者さんに問えば一発で答えが出るかも知れませんね。
未解決ですが、私自身も勉強になりました。

コード:

/////////////////////////////////////////////////////
//                                                 //
//                    Test Program                 //
//                                                 //
/////////////////////////////////////////////////////

#include <DxLib.h>

//共通項
#define FONT_COLOR			0xff0000	//フォント色
#define TRANS_COLOR			0, 0, 1		//透過色
#define WINDOW_CHANGEABLE	TRUE		//ウインドウサイズ変更
#define WINDOW_MODE			TRUE		//ウインドウモード

//デバッグ時のみ実行
#ifdef	_DEBUG
#define LOG_OUT				TRUE		//ログ出力
#define WINDOW_WIDTH		 800		//ウインドウ幅
#define WINDOW_HEIGHT		 600		//ウインドウ高さ
#define WINDOW_COLOR_DEPTH	 32			//ビット深度
#define WINDOW_TITLE		"[debug]"	//ウインドウタイトル

//リリース時のみ実行
#else
#define LOG_OUT				TRUE		//ログ出力
#define WINDOW_WIDTH		 800		//ウインドウ幅
#define WINDOW_HEIGHT		 600		//ウインドウ高さ
#define WINDOW_COLOR_DEPTH	  32		//ビット深度
#define WINDOW_TITLE		"[release]"	//ウインドウタイトル
#endif

LONGLONG	LL_frametime{};				//フレーム時間計測用
LONGLONG	LL_starttime{};				//処理開始時刻
LONGLONG	LL_processtime{};			//処理時間
LONGLONG	LL_maxtime{};				//最大処理時間
LONGLONG	LL_framecount{};			//フレームカウント
LONGLONG	LL_totalprocess{};			//合計処理時間
LONGLONG	LL_averagetime{};			//平均処理時間

//時間計測前処理
void BeforeProcess();

//時間計測後処理
void AfterProcess();

//*** アプリケーションエントリーポイント ***//
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	SetOutApplicationLogValidFlag(LOG_OUT);							//ログ出力設定
	ChangeWindowMode(WINDOW_MODE);									//ウインドウモード変更
	SetGraphMode(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_COLOR_DEPTH);	//ウインドウサイズ&ビット深度設定
	SetTransColor(TRANS_COLOR);										//透過色設定
	SetWindowSizeChangeEnableFlag(WINDOW_CHANGEABLE);				//ウインドウサイズ変更可能フラグ設定
	SetWindowTextA(WINDOW_TITLE);									//ウインドウタイトル設定
	if (DxLib_Init() == -1) return -1;								//DxLibを初期化→DxLibが異常なら、アプリを異常終了
	SetDrawScreen(DX_SCREEN_BACK);									//描画画面を裏画面に切り替え

	int			i_imagehandle	= LoadGraph("Data\\WhitePlate.bmp");	//画像ハンドル
	LONGLONG	LL_testtime[2]	= { 0LL, 0LL };							//Test処理時間

	//メインループ
	while ((ScreenFlip() == 0 && ProcessMessage() == 0 && ClsDrawScreen() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0))
	{
		BeforeProcess();							//時間計測前処理

		//Test Start!
		/******************************************************************************************************************************/

		LL_testtime[0] = GetNowHiPerformanceCount();
		DrawBox(100, 50, 200, 100, 0xffffff, TRUE);
		LL_testtime[0] = GetNowHiPerformanceCount() - LL_testtime[0];

		LL_testtime[1] = GetNowHiPerformanceCount();
		DrawGraph(100, 50, i_imagehandle, FALSE);
		LL_testtime[1] = GetNowHiPerformanceCount() - LL_testtime[1];

		DrawFormatString(0, 0, FONT_COLOR, "1st : DrawBox()   = %5lld / 2nd : DrawGraph() = %5lld", LL_testtime[0], LL_testtime[1]);

		/******************************************************************************************************************************/
		//Test End!

		AfterProcess();								//時間計測後処理

		if (LL_framecount++ == MAXLONGLONG) break;	//フレームカウント更新&オーバーフロー対策
	}

	DxLib::DxLib_End();								//DxLib終了処理
	return 0;										//アプリケーション終了
}

//時間計測前処理
void BeforeProcess()
{
	if (LL_framecount > 0LL)
	{
		LL_frametime = GetNowHiPerformanceCount() - LL_starttime;	//フレーム時間保存
	}
	LL_starttime = GetNowHiPerformanceCount();						//処理開始時刻保存
}

//時間計測後処理
void AfterProcess()
{
	if (LL_framecount > 0LL)
	{
		LL_processtime = GetNowHiPerformanceCount() - LL_starttime;		//処理時間計測
		LL_totalprocess += LL_processtime;								//合計処理時間計測
		LL_averagetime = LL_totalprocess / LL_framecount;				//平均処理時間計測
		if (LL_maxtime < LL_processtime) LL_maxtime = LL_processtime;	//最大処理時間更新
		DrawFormatString(0, 580, FONT_COLOR,
			"Process Time [μs] : %5lld/%5lld[Ave.%5lld/Max.%5lld]",
			LL_processtime, LL_frametime, LL_averagetime, LL_maxtime);	//フレーム時間/処理時間[平均処理時間/最大処理時間]
	}
}
素人的な質問は、素人に聞こう!

危ない危ない。
ちゃんとした人に質問しましょう。
ちなみに私は、ちゃんとしていない素人です。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: DXライブラリ 画面のある一部だけ色を変えたい

#5

投稿記事 by ISLe » 8年前

Windows 10 Pro
Intel Core 2 Duo E6850 (3GHz x2)
GeForce GTS 250
といううちの環境だと
【DrawBoxで(100, 50)-(200, 100)の領域を白塗り】→ 約0.18マイクロ秒
【(100×50)のBMP画像をDrawGraphで(100, 50)に描画】→ 約0.14マイクロ秒
ですね。
VC++2015でコンパイルオプションなしの場合
ちなみに
【DrawBoxで(100, 50)-(200, 100)の領域を白塗り】で毎回GetColor呼び出していると約0.20マイクロ秒
でした。
#GetColor超遅い

わたしはDrawBoxをお勧めします。
背景として真っ白だと明る過ぎるからちょっと暗くしようとかいうことになっても簡単に変えられますし。


ピーちゃん

Re: DXライブラリ 画面のある一部だけ色を変えたい

#7

投稿記事 by ピーちゃん » 8年前

いろいろな方法があったんですね、
もっとリファレンスを読み込たいと思います。
今回は、DrawBoxを使おうと思います!

閉鎖

“C言語何でも質問掲示板” へ戻る