トップページ > 過去ログ > 記事閲覧
高速化
名前:rs 日時: 2007/07/30 18:44

こんな感じで pat = MakeGraph( 240 , 240 ) ; GetDrawScreenGraph( 40 , 0 , 280 , 240 , pat ) ; for ( int i = 0; i < 240; i += 1 ) { DrawRectGraph( 40 + ((int)( cos(( theta + i * 2 ) * PI / 180 ) * speed )), i, 0, i, 240, 1, pat, TRUE, FALSE ); } theta += 4; if ( theta >= 360 ) theta -= 360; DeleteGraph( pat ); フレーム毎に画面をキャプチャしてラスタースクロールを やっているんですが、どうも画面をキャプチャが重いようなのです なんとかしてこれを高速化することは出来ないでしょうか?

Page: 1 |

Re: 高速化 ( No.1 )
名前:Will 日時:2007/07/31 09:28

過去の管理人さんからの回答で、画像処理は画像の縦横のサイズが2のn乗であるときがもっとも高速であるとありましたので、 240 -> 256 とすればいくらか早くなるとは思いますが、画面設計が変わってしまいますよね(^^; あとは、毎フレームMakeGraph->DeleteGraphとするのではなく、 ラスター処理開始前にMakeGraphをし、ラスター処理中はそのエリアを使いまわして、 ラスター処理が終わるときにDeleteGraphすることで多少早くなると思います。
Re: 高速化 ( No.2 )
名前:rs 日時:2007/07/31 17:00

Willさんレスありがとうございます 毎フレームラスターしなくては リアルタイムに反映しませんのでこれははずせませんねぇ・・ (forループ1回につきMakiGraphしてるわけではありません) どうも知人の話では画面をキャプチャするのが重いらしいんですが キャプチャなしでする方法は無いものでしょうか?
Re: 高速化 ( No.3 )
名前:A 日時:2007/07/31 21:46

 GetDrawScreenGraph()はコピーが入るので重そうですね。  代わりに 1 空のグラフィックを作る 2 1で作ったハンドルを描画先にする SetDrawScreen()を使って描画先にする 3 ラスタースクロールさせたい絵を描き込む 4 SetDrawScreenで描画先を元に(裏面)戻す 5 1で作ったグラフィックを使ってラスタースクロールを描画する  という方法ではどうでしょうか。  この方法でしたら負荷は最小限で済むと思います。 (ただグラフィックスチップが古いと動かないかもしれません) #include "DxLib.h" // ウインドウのサイズ const int ScreenSize_Width = 640; const int ScreenSize_Height= 360; // メイン関数 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ::ChangeWindowMode(TRUE); ::SetGraphMode(ScreenSize_Width, ScreenSize_Height, 32); if(::DxLib_Init()==-1)return -1; // 1 SetDrawValidGraphCreateFlag(TRUE); int renderScreen = MakeGraph(ScreenSize_Width, ScreenSize_Height); SetDrawValidGraphCreateFlag(FALSE); // 2 SetDrawScreen(renderScreen); // 3 int white_color = GetColor(255, 255, 255); int red_color = GetColor(255, 80, 80); DrawCircle(ScreenSize_Width/2, ScreenSize_Height/2, 100, red_color, TRUE); DrawString(100, 100, "Test String", white_color); // 4 SetDrawScreen(DX_SCREEN_BACK); // 5 DrawExtendGraph(0, 0, ScreenSize_Width/2, ScreenSize_Height/2, renderScreen, FALSE); ScreenFlip(); WaitKey(); DxLib_End(); return 0; }
Re: 高速化 ( No.4 )
名前:rs 日時:2007/08/01 18:07

Aさんレスありがとうございます、 スクリーンバッファって自分で作れたんですね、 知らなかった・・・ ところでSetDrawValidGraphCreateFlagって何でしょうか? 関数リファレンスのところには載ってないようなので・・
Re: 高速化 ( No.5 )
名前:A 日時:2007/08/01 18:41

 実は関数リファレンス(dxfunc2.html)に載っています(といっても一行しか説明はありませんが)。  この関数は「描画可能なグラフィックを作成するかどうかのフラグをセットする」するものです。  デフォルトはFALSEなので、MakeGraphの前後で切り換える必要があります。
Re: 高速化 ( No.6 )
名前:rs 日時:2007/08/01 20:25

成る程分かりました。 返信ありがとうございました。

Page: 1 |