DXライブラリでは、基本的にウインドウの背景色は真っ黒です。
例えば、「800*600のウインドウを作成して、その中の100*50から200*100までの区間は白色に変える」なんていうことは可能なのでしょうか。
それができなければ、白色の画像を作り描画しようと思いますが、できればソースから色を変えたいです。
その方法があればぜひ教えてください!
DXライブラリ 画面のある一部だけ色を変えたい
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ 画面のある一部だけ色を変えたい
DrawBoxで塗るのが一番素直だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ 画面のある一部だけ色を変えたい
私個人的には、『白色の画像を作り描画』するのがベストだと思います。
矩形の描画命令を使用するのは微塵ほどですけれど負荷がありますし、
画面消去後、シンプルにグラフィックハンドルからの画像を貼るのが
高速で良いと思います。
その他、DXライブラリを無視した描画方法も数通りありますが、結局
やる事は『矩形描画命令』『白画像を貼る』の二択が基本になります。
実行メモリを微塵でも減らしたいのであれば、『矩形描画命令』でも
問題ないレベルの負荷だと思います。
***DXライブラリのウインドウ(800×600サイズ)での処理時間***
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
【DrawBoxで(100, 50)-(200, 100)の領域を白塗り】→ 約120マイクロ秒
【(100×50)のBMP画像をDrawGraphで(100, 50)に描画】→ 約30マイクロ秒
※debugモード、GetNowHiPerformanceCount()使用での計測結果です!
ウチのPCでの大雑把な結果ですが、それぞれの処理時間の差は明らかです。
CPUによって処理時間比率に多少の誤差はあると思いますので、ご自身のPCでも
お試しになられたら、より理解しやすいと思います。
追記:
Releaseモードでも、どちらもdebugモードの場合とほぼ同じ処理時間でした。
矩形の描画命令を使用するのは微塵ほどですけれど負荷がありますし、
画面消去後、シンプルにグラフィックハンドルからの画像を貼るのが
高速で良いと思います。
その他、DXライブラリを無視した描画方法も数通りありますが、結局
やる事は『矩形描画命令』『白画像を貼る』の二択が基本になります。
実行メモリを微塵でも減らしたいのであれば、『矩形描画命令』でも
問題ないレベルの負荷だと思います。
***DXライブラリのウインドウ(800×600サイズ)での処理時間***
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
【DrawBoxで(100, 50)-(200, 100)の領域を白塗り】→ 約120マイクロ秒
【(100×50)のBMP画像をDrawGraphで(100, 50)に描画】→ 約30マイクロ秒
※debugモード、GetNowHiPerformanceCount()使用での計測結果です!
ウチのPCでの大雑把な結果ですが、それぞれの処理時間の差は明らかです。
CPUによって処理時間比率に多少の誤差はあると思いますので、ご自身のPCでも
お試しになられたら、より理解しやすいと思います。
追記:
Releaseモードでも、どちらもdebugモードの場合とほぼ同じ処理時間でした。
素人的な質問は、素人に聞こう!
↑
危ない危ない。
ちゃんとした人に質問しましょう。
ちなみに私は、ちゃんとしていない素人です。
↑
危ない危ない。
ちゃんとした人に質問しましょう。
ちなみに私は、ちゃんとしていない素人です。
Re: DXライブラリ 画面のある一部だけ色を変えたい
PCや他のコードとの絡みで、処理時間にかなり幅がある事が判明しました。
以下のコードは、付け焼刃で只今作ったものです。
VS2013 Core-i7 920 2.67GHz 環境下で素で比べてみると、
殆ど同じ処理時間でした(汗)。
平均処理時間を出したい場合は、画面下部に表示されるテキストのコードを
ご参考下さい。
しかしながら……
こんな感じでアプリが完成するまでちょこちょこ様子を見ながらどの
方式がベストかをチョイスするのが一見良いみたいですが、実際に
裏側で行われている処理(レンダリング)を考慮すると、このコードで
見える数値だけでは断定できないです。
私はDXライブラリの内部設計についてはあまり詳しくないので、これ
以上の深い部分につきましては分からないです。
すみません。m(_ _)m
ライブラリの作者さんに問えば一発で答えが出るかも知れませんね。
未解決ですが、私自身も勉強になりました。
以下のコードは、付け焼刃で只今作ったものです。
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); //フレーム時間/処理時間[平均処理時間/最大処理時間]
}
}
素人的な質問は、素人に聞こう!
↑
危ない危ない。
ちゃんとした人に質問しましょう。
ちなみに私は、ちゃんとしていない素人です。
↑
危ない危ない。
ちゃんとした人に質問しましょう。
ちなみに私は、ちゃんとしていない素人です。
Re: DXライブラリ 画面のある一部だけ色を変えたい
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をお勧めします。
背景として真っ白だと明る過ぎるからちょっと暗くしようとかいうことになっても簡単に変えられますし。
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をお勧めします。
背景として真っ白だと明る過ぎるからちょっと暗くしようとかいうことになっても簡単に変えられますし。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: DXライブラリ 画面のある一部だけ色を変えたい
まずは関数リファレンスを読みましょう。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
Re: DXライブラリ 画面のある一部だけ色を変えたい
いろいろな方法があったんですね、
もっとリファレンスを読み込たいと思います。
今回は、DrawBoxを使おうと思います!
もっとリファレンスを読み込たいと思います。
今回は、DrawBoxを使おうと思います!