Re: GetDrawCallCountについて ( No.1 ) |
- 名前:管理人 日時:2018/02/24 01:34
手元で確認した限りでは DrawBox や DrawLine もカウントされていました
紛らわしくてすみません、GetDrawCallCount で得られる『描画コールの回数』とは『描画関数が呼ばれた回数』ではなく、
Windows 環境の場合は『Direct3D の描画API が呼ばれた回数』となります
なので、例えば以下のような DrawLine を連続で10回呼ぶようなプログラムでは Direct3D の描画API の呼び出しは 1回で済むので、
画面に表示される数値は DrawFormatString の文字列描画も合わせて 2 となります
SetDrawScreen( DX_SCREEN_BACK ) ;
while( ProcessMessage() == 0 )
{
ClearDrawScreen() ;
for( int i = 0 ; i < 10 ; i ++ )
{
DrawLine( 0, i * 16, 100, i * 16, GetColor( 255,255,255 ) ) ;
}
DrawFormatString( 200, 200, GetColor( 255,255,255 ), "%d", GetDrawCallCount() ) ;
ScreenFlip() ;
}
同じ画像を連続で描画した場合や DrawBox を連続で使用した場合、DrawLine を連続で使用した場合などは
Direct3D の描画API の呼び出し回数はそれぞれ 1回から数回で済み、Direct3D の描画API の呼び出し回数が
少なくて済むとそれだけ CPU負荷が小さくなるので、DrawGraph や DrawLine などの描画関数の呼び出し回数に対して
GetDrawCallCount の戻り値が比率的に少ないほど効率的に描画処理が行えているということになります
|
Re: GetDrawCallCountについて ( No.2 ) |
- 名前:BayLeaf 日時:2018/02/24 13:53
把握しました。
どうやら Draw 関連の FillFlag において TRUE, FALSE を
交互に呼び出しているかどうかで変わっているようでした。
ところで FillFlag の有無で呼び出し回数が変わるのですが、
Draw 関連の描画API は内部的には別々ということでしょうか?
例えば、表示の仕方は置いといて
1. 呼び出し回数20回
for(int i = 0; i < 10; i++){
DrawCircle(i * 20, 10, 5, -1, TRUE);
DrawCircle(i * 20, 10, 5, -1, FALSE);
}
2. 呼び出し回数2回
for(int i = 0; i < 10; i++){
DrawCircle(i * 20, 10, 5, -1, TRUE);
}
for(int i = 0; i < 10; i++){
DrawCircle(i * 20, 10, 5, -1, FALSE);
}
2のほうが少ない回数ですが、処理自体は軽くなっているのでしょうか?
もし軽くなるようで負荷が少なくなるのでしたら
自前のプログラムで変更できる箇所があるので上手く使用したいと思います。
|
Re: GetDrawCallCountについて ( No.3 ) |
- 名前:Tir 日時:2018/02/24 15:43
横からすみません
基本図形描画関数は画像を描画するより軽いと思っていたのですが
DrawCircleやDrawOvalは単体で描画API 呼び出し回数1回とするなら
円形の画像を読み込むか一度MakeScreen+DrawCircleで円形画像を作ってから
DrawRotaGraph+DrawModiGraphなどを組み合わせて連続で描画した方が効率がいいのでしょうか?
|
Re: GetDrawCallCountについて ( No.4 ) |
- 名前:管理人 日時:2018/02/25 01:57
> ところで FillFlag の有無で呼び出し回数が変わるのですが、
> Draw 関連の描画API は内部的には別々ということでしょうか?
はい、FillFlag が TRUE の場合と FALSE の場合では描画処理が異なります
> ところで FillFlag の有無で呼び出し回数が変わるのですが、
> Draw 関連の描画API は内部的には別々ということでしょうか?
DrawCircle は 1回の実行に最低でも必ず 1回の描画API呼び出しが発生するので
載せていただいた例では 1 も 2 も負荷は同じとなります
仮に DrawCircle の代わりに DrawBox だった場合は 2 の方が軽くなります
> Tirさん
> 基本図形描画関数は画像を描画するより軽いと思っていたのですが
> DrawCircleやDrawOvalは単体で描画API 呼び出し回数1回とするなら
> 円形の画像を読み込むか一度MakeScreen+DrawCircleで円形画像を作ってから
> DrawRotaGraph+DrawModiGraphなどを組み合わせて連続で描画した方が効率がいいのでしょうか?
はい、DXライブラリの DrawCircle や DrawOval は重いので一度 MakeScreen で作成した
画像に描画したものを DrawRotaGraph などで連続描画したほうが効率が良いです
|
Re: GetDrawCallCountについて ( No.5 ) |
- 名前:Tir 日時:2018/02/25 11:22
回答ありがとうございます
何故だか勝手に通常の画像描画より基本図形描画関数の方が軽いと思い込んでいたのでこれでより効率化出来そうです。
ただDrawCircl1回だけの描画やDrawBoXで同じ数だけ描画なら描画速度は分かりませんが
メモリに読み込まない関係上基本図形描画関数の方がメリットがありそうですね
|
Re: GetDrawCallCountについて ( No.6 ) |
- 名前:BayLeaf(解決) 日時:2018/02/26 00:33
> DrawCircle は 1回の実行に最低でも必ず 1回の描画API呼び出しが発生するので
> 載せていただいた例では 1 も 2 も負荷は同じとなります
>
> 仮に DrawCircle の代わりに DrawBox だった場合は 2 の方が軽くなります
DrawCircle と DrawBox では描画APIの呼び出し頻度が異なるのですね。
数年前に個人的なプログラムで処理落ちしていた原因が分かった気がします。
それと私もTirさんと同じように基本図形のほうが軽いと思っていたので
今後は DrawCircle か画像かを状況に応じて使用しようと思います。
そこに関してはメモリと処理速度とのバランスも大事ですので
色々と頭を悩ませることになりそうです。
ともかく、おかげさまでまた一つ知識が増えました。
ありがとうございました。
|