MakeScreen関数で生成した画像を初期化し続けたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wasawasa
記事: 94
登録日時: 11年前

MakeScreen関数で生成した画像を初期化し続けたい

#1

投稿記事 by wasawasa » 11年前

いつもお世話になっております。
画面の一部分を描画範囲と定めてからそこの部分だけに画像を描画するために、

MakeScreen関数でスクリーンとなる画像を作成

while(){
スクリーン画像に画像を描画→スクリーン画像を裏画面に描画→裏画面を表画面に反映→スクリーン画像を初期化
}

という構想でプログラムを書いていたのですが、スクリーン画像を初期化する処理をどうやったら良いか困っています。
一応、毎フレームの初期化をMakeScreen関数で行う方針で下記のような方針の記述を書いて試してみたのですが、やはり重いと感じました。
MakeScreen関数で生成した画像をClearDrawScreen関数のように高速の処理で何度も初期化できるような方法は何か無いでしょうか?
どなたかよろしくお願いします。

コード:

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

        int Screen=MakeScreen(640,424,TRUE);

        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
                        Screen=MakeScreen(640,424,TRUE);
			SetDrawScreen(Screen);
			//画像の描画
			SetDrawScreen(DX_SCREEN_BACK);
                        DrawGraph(0,41,Screen,TRUE);
        }
        DxLib_End(); // DXライブラリ終了処理
        return 0;
} 

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: MakeScreen関数で生成した画像を初期化し続けたい

#2

投稿記事 by みけCAT » 11年前

素直にClearDrawScreen関数では初期化できないのですか?
また、提示されたプログラムでは重いだけではなく画像ハンドルがリークして良くない気がします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

wasawasa
記事: 94
登録日時: 11年前

Re: MakeScreen関数で生成した画像を初期化し続けたい

#3

投稿記事 by wasawasa » 11年前

>>みけCATさん
ClearDrawScreen関数は裏画面でしか使えないと思っていました。
描写先を変えてからClearDrawScreenを入れれば普通に初期化できるみたいですね。
つまらぬことにお手数おかけしました。

つまらぬ事を聞いてしまったついでにハンドルリークについて質問させてください。
「ハンドルリーク」という言葉を調べたところ「ハンドルの閉じ忘れにより、プロセス内に無駄なリソースが蓄積された状態になること」とありました。
しかし、そもそもハンドルの開け閉めという概念がよく分からないので、どういう時にハンドルが開くのか(今回提示したプログラムだと4行目で開いているのでしょうか?)、どういう時にハンドルが閉じるのかを教えていただけないでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: MakeScreen関数で生成した画像を初期化し続けたい

#4

投稿記事 by softya(ソフト屋) » 11年前

wasawasaさんは、MakeScreen()でスクリーン画像を生成しているわけですから、それは自分で解放しない限りメモリに存在します。
ハンドルはその画像の管理番号ですのでハンドルを閉じるとは、管理番号で示されるその画像を捨ててメモリを解放するって事です。
ループ中でMakeScreen()が連続で呼ばれた場合、呼ばれる毎にメモリが確保し続けられます。やがてはメモリが足らなくなるでしょう。
ちなみにDxLib_End();などで全ハンドルは解放されますが、ゲーム中で累積するものは救いようがありません。
必要がなくなったらDeleteGraph()で解放する。無闇に確保しない。を心がけてください。

> 今回提示したプログラムだと4行目で開いているのでしょうか?)
4と7行目です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: MakeScreen関数で生成した画像を初期化し続けたい

#5

投稿記事 by みけCAT » 11年前

DXライブラリ3.11dのDxLib.hによると、同時に持てるグラフィックハンドルの最大数は32768個なので、
No: 1のコードだと60fpsなら約10分で描画できなくなるかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

wasawasa
記事: 94
登録日時: 11年前

Re: MakeScreen関数で生成した画像を初期化し続けたい

#6

投稿記事 by wasawasa » 11年前

>softyaさん、みけCATさん
大変分かり易く説明していただきありがとうございます。
私がすでに組んだいくつかの記述で思い当たる節が山ほどあるのでこれからチェックしてみたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る