トップページ > 記事閲覧
裏画面を加工して自前の処理で表画面に描画する方法について
名前:kanamaru 日時: 2018/06/14 15:02

今、ScreenFlipを使わず裏画面を加工して表画面に自前の処理で描画しているのですが、以下の二つの問題に悩まされています。 ・処理が重い ・裏画面が描画されている? アニメーションさせなければ問題は発生しません。 問題の原因は何でしょうか? DXライブラリが古いバージョンを使っていたので最新版に更新してみましたが、同じ問題が発生します。 以下再現ソースを掲載します。 #include "Dxlib.h" int width, height; int DxLib_Init2() { if (DxLib_Init() == -1) DxLib_End(); int Cb; GetScreenState(&width, &height, &Cb); return 0; } void ScreenFlip2() { SetDrawScreen(DX_SCREEN_BACK); int handle = MakeGraph(width, height); GetDrawScreenGraph(0, 0, width, height, handle); SetDrawScreen(DX_SCREEN_FRONT); ClsDrawScreen(); DrawExtendGraph(0, 0, width*0.5, height, handle, TRUE); DrawExtendGraph(width*0.5, 0, width, height, handle, TRUE); } int WINAPI WinMain(HINSTANCE h1,HINSTANCE hp,LPSTR lpC,int nC) { ChangeWindowMode(true); //if (DxLib_Init() == -1) return -1; if (DxLib_Init2() == -1) return -1; SetDrawScreen(DX_SCREEN_BACK); for (int i = 0; i < 480; i++) { ClsDrawScreen(); DrawBox(i, i, i+10, i+10, GetColor(255, 255, 255), TRUE); ScreenFlip2(); WaitTimer(125); } WaitKey(); DxLib_End(); return 0; } ちなみに、初期化関数が別関数に分離しているのは今後作る他関数でも画面サイズを使う予定があるからです 現在ヘッダーに上記二つの関数は分離していますが、上記を実行しても問題が同じく発生することは確認済みです。
メンテ

Page: 1 |

Re: 裏画面を加工して自前の処理で表画面に描画する方法について ( No.1 )
名前:kanamaru 日時:2018/06/14 19:42

裏画面の内容が描画されてるような現象は原因が判明しました。 描画先を表画面にして、そのまま表画面に描画してたみたいです。 解決策もわかったので、こっちは大丈夫です。 なので、処理が重いのはどうにかなりませんか?
メンテ
Re: 裏画面を加工して自前の処理で表画面に描画する方法について ( No.2 )
名前:kanamaru 日時:2018/06/15 11:07

本当に申し訳ありません。自己解決しました。 変更したのは以下の三点です ・ScreenFlip2の処理の最初にてGetDrawScreenの返り値を保存、処理の最後にてSetDrawScreenに指定して描画先を戻すようにした。 ・makegraphをDxlib_Init2に移した。 ・WaitTimerを消した。 とはいっても三番目のは正解かわかりませんし、今後ScreenFlip2の処理は書き足すつもりなので処理を軽くできるのなら軽くしたいので、 処理を軽くする方法がありましたら教ええてください。
メンテ
Re: 裏画面を加工して自前の処理で表画面に描画する方法について ( No.3 )
名前:管理人 日時:2018/06/17 00:45

現在のDXライブラリでは『表画面』への描画は非常に重いものとなっていますので、 『裏画面に描画した結果を加工して画面に出力する』という目的でしたら ・裏画面に描画  ↓ ・GetDrawScreenGraph で取り込み  ↓ ・表画面に描画して表示 よりも ・MakeScreen で作成した『描画対象にできる画像』に描画  ↓ ・裏画面に『MakeScreen で作成した『描画対象にできる画像』』を描画  ↓ ・ScreenFlipで表示 とする方が高速です 載せていただいたプログラムを MakeScreen で作成できる『描画対象にできる画像』を使用するように 変更した場合は以下のようになりますので、よろしければご覧ください m(_ _)m #include "DxLib.h" int screen; int width, height; int DxLib_Init2() { if (DxLib_Init() == -1) DxLib_End(); int Cb; GetScreenState(&width, &height, &Cb); screen = MakeScreen(width,height,FALSE); return 0; } void ScreenFlip2() { SetDrawScreen(DX_SCREEN_BACK); DrawExtendGraph(0, 0, width*0.5, height, screen, TRUE); DrawExtendGraph(width*0.5, 0, width, height, screen, TRUE); ScreenFlip(); } int WINAPI WinMain(HINSTANCE h1,HINSTANCE hp,LPSTR lpC,int nC) { ChangeWindowMode(true); //if (DxLib_Init() == -1) return -1; if (DxLib_Init2() == -1) return -1; for (int i = 0; i < 480; i++) { SetDrawScreen(screen); ClsDrawScreen(); DrawBox(i, i, i+10, i+10, GetColor(255, 255, 255), TRUE); ScreenFlip2(); } WaitKey(); DxLib_End(); return 0; }
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存