DeleteGraphについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぬっち

DeleteGraphについて

#1

投稿記事 by ぬっち » 16年前

こんにちは。
最近ゲームで、場面に応じて使っていない画像をDeleteGraphで消すことをしているのですが、問題が出てきてしまったのでここで質問させていただきます。

私のプログラムでは、ステージが変わるときに、
①DeleteSoundMemやDeleteGraphでクリアしたステージの画像や音楽をメモリから消去
②LoadSoundMemやLoadGraphで次のステージの画像や音楽をメモリに読み込む
という処理をしています。
しかし、この処理を行うとなぜか、次のステージで処理速度が遅くなってしまいます。(普段FPS60のところがFPS3くらいに)
そこで、何度も画像を読み込んでいるのかもしれないと思い、画像の読み込みをなくすとFPSは60で安定します。
さらに、原因を見つけるために、読み込む画像のうち一部だけを読み込むようにするとFPSは60で安定しました。
これらのことから、何度も画像を読み込んでいるのはないと思ったのですが、そうするとなぜ読み込む画像のうち一部だけこの処理を行うと処理速度が重くなるのかということがわからなくなりました。

このことに関係しているのかもしれませんが、
int image[15];
というように宣言しておいて
image_[6]=LoadGraph("1.png");
と読み取り、ステージクリア後、
DeleteGraph(image_[6]);
としてメモリから消去する。そして、
image_[3]=LoadGraph("2.png");
として次のステージの画像を読み取る、つまりimage_[3]を使う前にimage_[6]を使うという処理は問題ないのでしょうか?

アドバイスよろしくお願いします。

Justy

Re:DeleteGraphについて

#2

投稿記事 by Justy » 16年前


>そうするとなぜ読み込む画像のうち一部だけこの処理を行うと処理速度が重くなるの

 これだけではちょっと何ともいえません。

 各関数の処理にかかった時間を調べて、どこで時間がかかっているのか
調べてみてはどうでしょうか?

 全部の関数を調べると大変なので、最初はメインループ内から直接コールしている
関数から少しずつ絞り込んで調べていって、どの関数内でどのデータを扱っている
時に遅いのかを調べてみて下さい。

 ちなみに「次のステージで」ということは、最初から次のステージを起動した場合は
発生しないのでしょうか?



>つまりimage_[3]を使う前にimage_[6]を使うという処理は問題ないのでしょうか

 つまり配列の途中をいきなり使っても大丈夫か、ということですか?
 問題ないはずです。

ぬっち

Re:DeleteGraphについて

#3

投稿記事 by ぬっち » 16年前

Justyさん返信ありがとうございます。

>配列
途中から使っても問題ないですか。
てっきりこれが問題なのかと思ってたので。

>最初から次のステージを起動
発生しませんでした。
どうやら、ステージクリア→画像・音楽のメモリの処理→次のステージという流れの時のみ起こるようです。

>各関数の処理の時間
今いろいろ試しているのですが、やはり画像をメモリに読み込む時に問題起こっているみたいです。
質問なんですが、
image_[2]=LoadGraph("1.png");
image_[4]=LoadGraph("2.png");
image_stage_2[2]=LoadGraph("3.png");
image_stage_2[3]=LoadGraph("4.png");
sound_[1]=LoadSoundMem("1.mp3");
sound_[2]=LoadSoundMem("1.mp3");
という感じにメモリに読み込んでも大丈夫でしょうか?(私のソースがこのような感じなので)

Justy

Re:DeleteGraphについて

#4

投稿記事 by Justy » 16年前


>やはり画像をメモリに読み込む時に問題起こっているみたいです

 ということは、fpsが低下するのは LoadGraph()などで読み込んでいる最中だけで
読み込みが終われば元に戻っているのですか?



>やはり画像をメモリに読み込む時に問題起こっているみたいです

 配列が十分に確保されているなら……その例なら image_は5以上……あれば問題はありません。
 

ぬっち

Re:DeleteGraphについて

#5

投稿記事 by ぬっち » 16年前

原因を見つけるために、ステージクリア→メモリの処理→次ステージの流れで
①通常通りの処理
②必要のない画像をメモリ上から消すという処理をなくす
③メモリに画像読み込むを読み込むという処理をなくす
④メモリに特定の画像のみ読み込むと言う処理のみにする
⑤最初から(プログラム起動時から)全ての画像をメモリに読み込んだ状態にする
ということを行ってみました。

結果は、

①FPSが3程度まで落ちる
②①と変わらず
③FPS60で安定
④場合によって異なる
⑤FPS60で安定

④について詳しく書くと、たとえば、
image_stage[2]=LoadGraph("3.png");
image_stage[3]=LoadGraph("4.png");
sound_[1]=LoadSoundMem("1.mp3");
sound_[2]=LoadSoundMem("1.mp3");
となっている場合ではFPS60安定で、
image_[2]=LoadGraph("1.png");
image_[4]=LoadGraph("2.png");
image_stage_2[3]=LoadGraph("4.png");
sound_[1]=LoadSoundMem("1.mp3");
sound_[2]=LoadSoundMem("1.mp3");
となっている場合の時FPSが低下する。

という感じです。

このことから、④のところで問題があると考えて、いろいろ試しているのですが上手くいきません。

Justy

Re:DeleteGraphについて

#6

投稿記事 by Justy » 16年前

 であるならば、どのファイルを読むと遅くなるのかを調べるのと同時に、
fpsが 3まで落ちている直接的な関数を特定した方がいいでしょう。

# ちなみにメモリが足らなくて、スワップが発生しまくっている、ってことはないですよね?

閉鎖

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