ページ 11

マスク処理の速度について

Posted: 2008年12月18日(木) 17:55
by 山崎
毎度お世話になります、山崎です。
今回はマスク処理の速度についてお伺いに参りました。

現在、RPGでいう「装備」のようなことを司るメニューを作っています。
左右のキーを押すことで文字列が横へスライドし、次の文字列がまた横から現れるといった感じの部分です。
この文字列のスライド(横方向への移動)をメニューウインドウとなる領域内だけで行い、
メニューウインドウの外へはみ出た文字列は描画しない、といった処理をしたいと思っています。

そこで、メニューウインドウ領域以外にマスクをして 領域内だけに文字列が描画されるようにしようと思い
CreateMaskScreen()関数を使ったところ、呼び出した瞬間に恐ろしいほど処理が重くなってしまいました。
フレームの切り替えを肉眼で指折り数えられるほどです。
なお、CreateMaskScreen()を試しに一度呼んだだけで、それ以外のマスク処理は全く行っておりません。

マスク処理にかかる負担はこれくらいで普通なのでしょうか?
それとも、何かほかに問題があって異常な遅さになっているのでしょうか。

それから余談なのですが、
DXライブラリの各関数を一回呼び出すのにかかる平均時間を知っておきたいと普段思っているのですが、
やはり引数によって一回の呼び出しにかかる時間が平均を求めても意味がないほどばらつくものなのでしょうか?
それとも、DrawBox()は平均何ミリ秒、CreateMaskScreen()は平均何ミリ秒と言えるものなのでしょうか?

Re:マスク処理の速度について

Posted: 2008年12月18日(木) 17:58
by バグ
PCのスペックなんかも影響するでしょうから、一概には言えないでしょうし…
計測用の関数を作成して、実際に計測してみては如何ですか?

Re:マスク処理の速度について

Posted: 2008年12月18日(木) 18:05
by Dixq (管理人)
>>DXライブラリの各関数を一回呼び出すのにかかる平均時間を知っておきたいと普段思っているのですが

これは私も結構前は思ってました。
DXライブラリ製作者様に関数の処理の重さをリファレンスで☆数使って書いてくれないかとお願いした事もある位^^;
でも、あらゆる処理に関係する関数もあり、スペックにも依存しますし、一概にかけない場合が多いんですよね。
ですから、自分が使う状況に応じて、測定してみるのがいいと思いますよ。

しかしリファレンスに「重くなるので多用禁止」みたいに特に注意がかかれていないものは、
通常の使用範囲内では特に重くならないと思います。
(・・といっても減算ブレンドは、アルファブレンドの数倍以上時間がかかるなど記載されていない部分はありますが)

その処理は
http://homepage2.nifty.com/natupaji/DxL ... .html#R4N3
こちらの関数では実現出来なさそうですか?

Re:マスク処理の速度について

Posted: 2008年12月18日(木) 18:25
by 山崎
バグ様、管理人様、
すばやいご返信誠にありがとうございます。

やはりスペックによってばらつきが出てしまうものなのですね。
GetNowHiPerformanceCountなどの関数を使って、自分なりに関数一度にかかる
平均時間を計ってみようと思います。

変なパソコンは使ってないと思うので、私のパソコンでの結果でも
参考としてくらいなら皆さんの役に少しは立てるかも・・・?

そして管理人様、SetDrawAreaを教えていただきありがとうございます。
リファレンスは毎日何度も見ているのですがSetDrawAreaを今まで使ったことがなく
完全にその存在を忘れておりました・・・。(汗)
ものすごく基本的なことをお伺いしてしまい本当に恥ずかしいです、猛省いたします。
私生活でも基本的なことほど見落とす質なので、友人によく笑われております(汗)

ありがとうございました。

Re:マスク処理の速度について

Posted: 2008年12月18日(木) 19:03
by Dixq (管理人)
計測する時は、マルチタスクOSでは正確な時間は計れないという事を念頭に置いた方がいいかもしれません。
後、あまり細か過ぎると、測定したい処理以外にかかった時間も含まれてしまう可能性があります。

以下、Calcに指定した回数だけ掛け算するプログラムですが、
指定した回数が x10 になっているにもかかわらず、計測時間は x10 になっていないこと、
そして計測するごとに測定時間がかわることを示しました。

この辺も注意して調べてみるといいと思います。
#include "DxLib.h"

void Calc(int num){
	int i;
	volatile double z;
	LONGLONG t;
	t = GetNowHiPerformanceCount();
	for(i=0,z=1; i<num; i++){
		z *= 12345.6789;
	}
	printfDx("%lld\n",GetNowHiPerformanceCount()-t);
}


int WINAPI WinMain(
	HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow ){
    ChangeWindowMode(TRUE);
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0 ) 
		return -1;
	
	Calc(1);
	Calc(10);
	Calc(100);
	Calc(1000);
	Calc(10000);
	Calc(100000);
	Calc(100000);
	Calc(100000);
	Calc(100000);

    ScreenFlip();
	WaitKey();
    DxLib_End();
    return 0;
}

Re:マスク処理の速度について

Posted: 2008年12月18日(木) 19:26
by 山崎
管理人様

貴重な情報をありがとうございます!!
ぜひとも参考にして計測してみようと思います。

コードや結果まで例示していただき大変恐縮です。