トップページ > 過去ログ > 記事閲覧
各描画関数の速度計測
名前:sy(サイ) 日時: 2009/10/19 11:20

ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1234 このログを見て気になりましたので早速テスト。 ※既出ならゴメンナサイ…。 7つある描画関数の内、一番遅いのが、機能最小限のはずの DrawGraphという結果に…。 なんか納得できないのでみなさんの環境ではどういう結果になるのかお聞かせください。 #include "DxLib.h" #define DRAW_TIMES 10000 char Key[256]; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ LONGLONG StartTime, EndTime[7] ; if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); // test1.bmpの読み込み int GHandle = LoadGraph( "test1.bmp" ) ; // 文字列の描画 DrawString( 250 , 240 - 32 , "計測中" , GetColor( 255 , 255 , 255 ) ); ScreenFlip(); //============================================== // 描画時間計測 //============================================== StartTime = GetNowHiPerformanceCount() ; // 現在経過時間を得る for(int i=0;i<DRAW_TIMES;i++){ // 読みこんだグラフィックを画面左上に描画 DrawGraph( 0 , 0 , GHandle , TRUE ) ; } EndTime[0] = GetNowHiPerformanceCount() - StartTime; StartTime = GetNowHiPerformanceCount() ; // 現在経過時間を得る for(int i=0;i<DRAW_TIMES;i++){ // 読みこんだグラフィックを反転描画 DrawTurnGraph( 0 , 0 , GHandle , TRUE ) ; } EndTime[1] = GetNowHiPerformanceCount() - StartTime; StartTime = GetNowHiPerformanceCount() ; // 現在経過時間を得る for(int i=0;i<DRAW_TIMES;i++){ // 読みこんだグラフィックを拡大描画 DrawExtendGraph( 0 , 0 , 119 , 480 , GHandle , TRUE ) ; } EndTime[2] = GetNowHiPerformanceCount() - StartTime; StartTime = GetNowHiPerformanceCount() ; // 現在経過時間を得る for(int i=0;i<DRAW_TIMES;i++){ // 読みこんだグラフィックを回転描画 DrawRotaGraph( 0 , 0 , 1.0f , 0.00 , GHandle , TRUE ) ; } EndTime[3] = GetNowHiPerformanceCount() - StartTime; StartTime = GetNowHiPerformanceCount() ; // 現在経過時間を得る for(int i=0;i<DRAW_TIMES;i++){ // 読みこんだグラフィックを回転描画 DrawRotaGraph2( 0, 0, 0, 0, 1.0f, 0.00, GHandle, TRUE ) ; } EndTime[4] = GetNowHiPerformanceCount() - StartTime; StartTime = GetNowHiPerformanceCount() ; // 現在経過時間を得る for(int i=0;i<DRAW_TIMES;i++){ // 読みこんだグラフィックを自由変形描画 DrawModiGraph( 0 , 0 , 119 , 0 , 119 , 480 , 0 , 480 , GHandle , TRUE ) ; } EndTime[5] = GetNowHiPerformanceCount() - StartTime; StartTime = GetNowHiPerformanceCount() ; // 現在経過時間を得る for(int i=0;i<DRAW_TIMES;i++){ // グラフィック中の(0,0)-(119,480)の部分を画面座標(100,100)に // 透過色処理あり、反転処理なしで描画 DrawRectGraph( 0, 0, 0, 0, 119, 480, GHandle, TRUE, FALSE ) ; } EndTime[6] = GetNowHiPerformanceCount() - StartTime; while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]==0){ for(int i=0;i<7;i++){ DrawFormatString( 0, 40+ i*32, GetColor( 255 , 255 , 255 ), " タイム %d:%I64d ", i, EndTime[i]) ; } ScreenFlip(); } DxLib_End(); return 0; } ●僕自身の結果(一回のみexe実行。平均値とかじゃないです) DrawGraph :2840    ←明らかに遅い^^; DrawTurnGraph :1238    ←ひっくり返るけど最速・・・ DrawExtendGraph :1244 DrawRotaGraph :1833 DrawRotaGraph2 :1377 DrawModiGraph :1303 DrawRectGraph :1390 ※画像などプロジェクトはライブラリ(ver. 2.25b)のzipの中のサンプル実行用フォルダのものを使用。 DrawRotaGraph2が機能的にも速度的にも申し分なし? 計測用のプログラムに問題などあればご指摘願いますm(_ _)m *Masaoさんからご指摘の場所後からコード修正しました。

Page: 1 |

Re: 各描画関数の速度計測 ( No.1 )
名前:Masao 日時:2009/10/19 11:05

Vista SP1 Library ver 3.00c Visual Studio Express Edition 2008 マシン:  CPU Dual core 2.0Ghz メモリ 6GB test1.bmp は 128-128 49KB のファイル にて実験。 ソースコードにコンパイルエラーあったので勝手に修正。 (Key が定義されていない。) 結果、 DrawGraph :6999 DrawTurnGraph :9692 DrawExtendGraph :10584 DrawRotaGraph :11062 DrawRotaGraph2 :9539 DrawModiGraph :9543 DrawRectGraph :10978 試行2回、結果ほぼ同等。 こちらの環境では予想どおりとなりました。
Re: 各描画関数の速度計測 ( No.2 )
名前:sy(サイ) 日時:2009/10/19 11:27

Masaoさま お早いご回答ありがとうございます。 この結果ですと、DrawTurnGraphとDrawExtendGraphとDrawRotaGraphは不要・・・ですかね^^; DrawRotaGraph2の実行速度が遅い環境が出て来なければ、DrawRotaGraph2を標準で使っていきたいですね。
Re: 各描画関数の速度計測 ( No.3 )
名前:Will 日時:2009/10/19 12:32

一回の実行速度だと値が小さすぎて10000回ループしているのだと思いますけど、 連続して同じ関数を呼び出した場合、すべての実行における実行時間の誤差があまりないという保証がなければ この結果は鵜呑みにできないんじゃないでしょうか。 たとえば、一回目の実行ではいろいろな変換があって遅くても、2回目以降だと前回のデータを再利用する ことで劇的に処理時間が短くなったりする関数とかあるかもしれませんし。 今回は同じグラフィックハンドルでのみ描画していますが、異なるグラフィックハンドルに対する描画 でも同じになるかどうかはわからないんじゃないでしょうか。
Re: 各描画関数の速度計測 ( No.4 )
名前:sy(サイ)-スレ終了 日時:2009/10/19 14:33

様々なファイルで試しました。 ある一つの画像に対する描画時間は同じものですが、別の画像を使用すると結果が変わってくるようです。 サンプル数を得るという意味で回数をたくさんにしましたが、画像によって結果が異なる上に環境に左右されやすいので、 環境ごとに画像ごとに得意不得意があるのでしょうね…。 一概にどれが良いとは言えなくなったため検証はこれで終わります。 m(_ _;)m

Page: 1 |